我有许多类似下面代码的绑定。
从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"/>
答案 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>