说我有这个控制权:
public partial class bloc999 : UserControl
{
bloc999Data mainBlock = new bloc999Data();
public bloc999()
{
InitializeComponent();
mainBlock.txtContents = "100";
base.DataContext = mainBlock;
}
}
xaml中的:
<TextBox Margin="74,116,106,0" Name="txtContents"
Text="{Binding Path=txtContents, UpdateSourceTrigger=PropertyChanged,Mode = TwoWay}" />
<TextBox Margin="74,145,106,132" Name="txtContents2"
Text="{Binding Path=txtContents2, UpdateSourceTrigger=PropertyChanged,Mode = TwoWay}" />
然后我有这个班:
public class bloc999Data : INotifyPropertyChanged
{
string _txtContents;
string _txtContents2;
public event PropertyChangedEventHandler PropertyChanged;
void NotifyPropertyChanged(string propName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(
this, new PropertyChangedEventArgs(propName));
}
public string txtContents2
{
get
{
return this._txtContents2;
}
set
{
if (int.Parse(value) > int.Parse(this._txtContents))
{
this._txtContents2 = "000";
}
else
this._txtContents2 = value;
NotifyPropertyChanged("txtContents2");
}
}
public string txtContents
{
get
{
return this._txtContents;
}
set
{
this._txtContents = value;
NotifyPropertyChanged("txtContents");
}
}
}
好的,现在说我在表单上有一个按钮,我在代码中执行此操作:
mainBlock.txtContents2 = "7777777";
它在文本框中输入000,但是如果我只是手动输入,在文本框(txtContents2)中,调用setter代码,但由于某种原因,文本框值不会更改,实例值确实会更改。帮助
答案 0 :(得分:1)
我认为这只是因为值在数据绑定操作的上下文中发生了变化,所以WPF只是忽略它,因为它知道值正在改变并认为事件是多余的。 不知道的是你已经离开并将值从WPF更改为其他内容。
如果您在单独的消息中进行通知,那么WPF将在当前数据绑定操作的上下文之外处理它,从而获取更改:
if (int.Parse(value) > int.Parse(this._txtContents))
{
this._txtContents2 = "000";
// notify WPF of our change to the property in a separate message
Dispatcher.BeginInvoke((ThreadStart)delegate
{
NotifyPropertyChanged("txtContents2");
});
}
else
{
this._txtContents2 = value;
NotifyPropertyChanged("txtContents2");
}
这假设您的视图模型可以访问Dispatcher
。如何执行此操作的示例显示在基础ViewModel
类的my blog post中。
答案 1 :(得分:0)
我之前遇到类似的问题here
在您的usercontrol中,更新Binding并将UpdateSourceTrigger设置为Explicit
<TextBox Margin="74,145,106,132" x:Name="txtContents2" TextChanged="txtContents2_TextChanged"
Text =“{Binding Path = txtContents2,UpdateSourceTrigger = Explicit,Mode = TwoWay}”/&gt;
然后在TextChanged事件处理程序中通过验证输入手动更新绑定。 从此事件处理程序中的bloc999Data中的属性txtContent2的setter移动验证逻辑
private void txtContents2_TextChanged(object sender, TextChangedEventArgs e)
{
if (int.Parse(txtContents2.Text) > int.Parse(mainBlock.txtContents))
{
mainBlock.txtContents2 = "000";
txtContents2.GetBindingExpression(TextBox.TextProperty).UpdateTarget();
}
else
{
mainBlock.txtContents2 = txtContents2.Text;
txtContents2.GetBindingExpression(TextBox.TextProperty).UpdateSource();
}
}
它有效。
希望它有所帮助!!