奇怪的绑定不能工作
本文关键字:不能 工作 绑定 | 更新日期: 2023-09-27 18:02:50
我有许多类似于下面代码的绑定。
从UI到属性的绑定工作得很好,但当我在后端代码中设置属性时就不起作用了。我不确定这里出了什么问题,因为我在XAML
中确实有Mode=TwoWaypublic 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>