我有一个.xaml文件和一个与Binding共享值的.cs文件。
为简单起见,我有1个按钮和1个文本框。我希望当文本框的文本没有字符时按钮被禁用。
以下是用于绑定的xaml的两个代码:
<TextBox Name="txtSend" Text="{Binding Path=CurrentText,UpdateSourceTrigger=PropertyChanged}"></TextBox>
<Button IsEnabled="{Binding Path=IsTextValid}" Name="btnSend">Send</Button>
.cs文件中的两个属性如下所示:
public string CurrentText
{
get
{
return this.currentText;
}
set
{
this.currentText = value;
this.PropertyChange("CurrentText");
this.PropertyChange("IsTextValid");
}
}
public bool IsTextValid
{
get
{
return this.CurrentText.Length > 0;
}
}
this.PropertyChanged
只是一种从INotifyPropertyChanged调用PropertyChanged
的方法。
问题是我必须调用CurrentText的Setter中的this.PropertyChange("IsTextValid");
才能使按钮状态发生变化。
问题1)是不是这样做的好方法......如果规则变得更复杂,我可能需要调用很多PropertyChanged ......?
问题2)表单加载时启用我的按钮。如何从一开始就检查方法?
答案 0 :(得分:2)
问题1:这是正确的。这样做没有问题。但是,您可以使用IDataErrorInfo查看验证。 (谷歌搜索它,你会发现很多很好的例子)
问题2:确保使用string.empty初始化“currentText”字符串。因为如果你没有初始化它,它将为null,并且IsTextValid的getter将抛出异常,并且WPF将无法检索该值。
或者这样做:
public bool IsTextValid
{
get
{
return ! string.IsNullOrEmpty( this.CurrentText );
}
}
答案 1 :(得分:0)
你的做法是正确的。如果你有点懒(就像我一样),你应该看看NuGet包Fody.PropertyChanged。
您的代码将简化为
public string CurrentText { get; set; }
public bool IsTextValid { get { return this.CurrentText.Length > 0; } }
Fody.PropertyChanged为你完成剩下的工作。它会自动添加所需的说明,以通知CurrentText
已更改,甚至会检测IsTextValid
取决于CurrentText
并通知它。