WPF绑定问题与更新值

时间:2009-07-11 17:15:54

标签: c# .net wpf binding

我有一个.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)表单加载时启用我的按钮。如何从一开始就检查方法?

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并通知它。