奇怪的绑定不能工作

本文关键字:不能 工作 绑定 | 更新日期: 2023-09-27 18:02:50

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

从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"/>

奇怪的绑定不能工作

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

当使用线程时,你必须小心不要从后台线程尝试任何ui绑定操作——这会导致"跨线程访问异常"。例如,这将抛出一个异常,因为属性"ipAddressOrDomain"是ui绑定的:

Task.Factory.StartNew(() => 
    ipAddressOrDomain = "something"       // throws exception
);
解决这个问题的方法,正如你注意到的,是将任何这样的操作分派回UI线程:
Task.Factory.StartNew(() => {
    Deployment.Current.Dispatcher.BeginInvoke(() => 
        ipAddressOrDomain = "something"   // ok
    );
});

旁注:如果你在Visual Studio中检查输出窗口,你应该会看到那里出现异常。当您注意到绑定失败时,可以从Output窗口开始。

你需要的是在帖子中:如何使绑定从ViewModel发生-特别是silverlight的答案…

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>