none
Textbox OneWay模式绑定问题 RRS feed

  • 问题

  • 不知道为何会绑定失败。
    <TextBox Grid.Row="0" Grid.Column="0" Name="txt01"></TextBox>
    <TextBox Grid.Row="1" Grid.Column="1" Name="txt02" Text="{Binding ElementName=txt01,Path=Text,Mode=OneWay}"></TextBox>
    运行后,在 txt01中输入文本,在OneWay模式下,txt02正常显示与txt01中一样的文本。
    ----------------------------------------------------------
    问题是,txt02没有disable,可以人为输入值。我一旦手工在txt02里面随便写几个字,然后再在txt01中修改,txt02则不会再变化了,不知道为何会这样,请教了。
    2010年3月29日 9:29

答案

  • txt02 可以被修改,使用 OneWay 不合适.

    对于可以被修改的 OneWay Binding, 一旦 Target 被非源改变,则它的 Binding 将被销毁.

    你的示例中,txt02 未被手动改变前:

        txt02.GetBindingExpression(TextBox.TextProperty) 是有效的.

    一旦用户对 txt02 输入:

       txt02.GetBindingExpression(TextBox.TextProperty) 将会是 null.

    使 txt02 IsEnabled 为 false 或 IsReadOnly 为 True 以保持其 Binding, 或者 在适当的时机重建 Binding.


    Hello, everyone
    • 已标记为答案 菜根香 2010年3月31日 7:19
    2010年3月29日 18:10

全部回复

  • txt02 可以被修改,使用 OneWay 不合适.

    对于可以被修改的 OneWay Binding, 一旦 Target 被非源改变,则它的 Binding 将被销毁.

    你的示例中,txt02 未被手动改变前:

        txt02.GetBindingExpression(TextBox.TextProperty) 是有效的.

    一旦用户对 txt02 输入:

       txt02.GetBindingExpression(TextBox.TextProperty) 将会是 null.

    使 txt02 IsEnabled 为 false 或 IsReadOnly 为 True 以保持其 Binding, 或者 在适当的时机重建 Binding.


    Hello, everyone
    • 已标记为答案 菜根香 2010年3月31日 7:19
    2010年3月29日 18:10
  • 谢谢您的回答。我明白了。那再问一个问题。

    <TextBox Grid.Row="0" Grid.Column="0" Name="txt01"></TextBox>
    <TextBox Grid.Row="1" Grid.Column="1" Name="txt02"></TextBox>

    我在程序里面实现OneWay绑定

      void txt01_TextChanged(object sender, TextChangedEventArgs e)
            {
                  Binding b=new Binding("");
                  b.Mode = BindingMode.OneWay;
                  b.Source = txt01.Text;
                  txt02.SetBinding(TextBox.TextProperty, b);
             
            }

    这样写,调试是没有问题的。正常的实现了OneWay的绑定,txt02输入以后,也不影响

    我想问的就是,如果这段代码贴在了构造函数里面,为何就不起作用了?难道只是绑定了一次?而不是设置了属性么?

    以下代码不起作用,我不知道为何

    //窗体的名字叫做WdBinding

     public Bingding b=new Binding("");
     public WdBinding()
            {
                InitializeComponent();
                b.Mode = BindingMode.OneWay;
                b.Source = txt01.Text;
                txt02.SetBinding(TextBox.TextProperty, b);
              
               //这段代码没有起到OneWay绑定的作用 ,不知道为何?难道非要写在txt01的TextChanged事件中么?
            }

    2010年3月30日 7:24
  • Hello,

    Binding b = new Binding("Text");

    或者 b.Path = new PropertyPath("Text");

    就可以了

    -------

    BTW, 写在 txt02 的 Loaded 事件会好点. 因为在 xaml 中 txt01 在txt02 之前, 所以可以确保 两个 textbox 的 isloaded 已经为 true. 这样可以降低风险和避免一些隐患。

     


    Hello, everyone
    2010年3月30日 17:31
  • 谢谢您的回答。我知道问题了。

    根本原因,在于 b.Source=txt01.Text

    txt01.Text 是一个string ,会被强制转换成;为绑定对象。

    应该修改为

    b.Path = new PropertyPath("Text");

    b.Source=txt01;

    2010年3月31日 7:22