奇怪的绑定不起作用

时间:2014-05-10 03:47:34

标签: c# windows-phone

我有许多类似下面代码的绑定。

从UI到属性的绑定工作正常,但是当我在后端代码中设置属性时,它不会工作。我不知道这里有什么问题,因为我的XAML中有Mode = TwoWay

public partial class app_controls : PhoneApplicationPage, INotifyPropertyChanged
{

  private String _ipAddress;
  public String ipAddressOrDomain
  {
      get { return _ipAddress; }
      set { _ipAddress = value; NotifyPropertyChanged("ipAddressOrDomain"); }
  }



  private void NotifyPropertyChanged(String propertyName)
  {
    if (PropertyChanged != null)
    {
          PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
  }
}

我明显地对两种方式都有约束力,所以我不知道问题是什么。

 <telerikPrimitives:RadTextBox  BorderBrush="Black" Background="Beige" Watermark="IP Address or Domain" Text="{Binding ipAddressOrDomain, Mode=TwoWay}" TextWrapping="Wrap" Visibility="{Binding traceToolVis}" InputScope="Url"/>

2 个答案:

答案 0 :(得分:1)

  

当我在Dispatcher.BeginInvoke lambda中包装设置属性的代码时,它设置属性没问题

使用线程时,必须注意不要从后台线程尝试任何UI绑定操作 - 这将导致交叉线程访问异常&#34;。例如,这将抛出异常,因为属性&#34; ipAddressOrDomain&#34;是UI界限:

Task.Factory.StartNew(() => 
    ipAddressOrDomain = "something"       // throws exception
);

正如您所指出的,解决这个问题的方法是将任何此类操作分发回UI线程:

Task.Factory.StartNew(() => {
    Deployment.Current.Dispatcher.BeginInvoke(() => 
        ipAddressOrDomain = "something"   // ok
    );
});

附注:如果在Visual Studio中检查“输出”窗口,则应该会看到异常。每当您发现绑定无声地失败时,“输出”窗口就是一个很好的起始位置。

答案 1 :(得分:0)

你需要的是帖子:How to make the binding happen from the ViewModel - 特别是银光的答案......

public class TextChangedUpdateSourceBehavior : Behavior<TextBox>
{
    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.TextChanged += OnTextChanged;
    }

    private void OnTextChanged(object sender, TextChangedEventArgs e)
    {
        var bindingExpression = AssociatedObject.GetBindingExpression(TextBox.TextProperty);

        if (bindingExpression != null)
        {
            bindingExpression.UpdateSource();
        }
    }
}

像这样使用:

<TextBox Text="{Binding TextValue, Mode=TwoWay}" Height="23" Width="300">
    <i:Interaction.Behaviors>
        <b:TextChangedUpdateSourceBehavior />
    </i:Interaction.Behaviors>
</TextBox>