如何在WPF中使用PropertyChanged而不是TextBox TextChanged事件?

时间:2018-03-13 12:29:06

标签: c# wpf

是否可以在WPF中的TextBox上使用PropertyChanged而不是TextChanged?如何知道PropertyChanged是否被触发?

我有这样的TextBox:

 <TextBox x:Name="kodpTxt" Text="{Binding Selected.KodP,UpdateSourceTrigger=PropertyChanged}" Width="75" Margin="84,55,0,0" />

我宁愿避免TextChanged事件,因为我从数据库更改kodpTxt绑定并且它的长度并不总是相同,所以我无法检查是否kodpTxt.Text.Length >= 5等。

我一直在寻找替代方案,并意识到我可以使用PropertyChanged做些什么,但我不知道如何找出PropertyChanged发生的时间。

private string _kodp;

public string KodP
{
    get { return _kodp; }
    set
    {
        _kodp = value;
        OnPropertyChanged("KodP");
    }
}
public void OnPropertyChanged(string name)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
}

public event PropertyChangedEventHandler PropertyChanged;

为了形象化我的问题,我会稍微描述一下:

我有ViewModelUserControl kodpTxt TextBox。在UserControl我设置了Selected.XYZ个职位。我无法操纵来自UserControl的{​​{1}}控件。这就是为什么我要找的东西:

ViewModel

Description

你能解释一下吗?

2 个答案:

答案 0 :(得分:2)

使用Mode=TwoWay

<TextBox x:Name="kodpTxt" Text="{Binding Selected.KodP, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="75" Margin="84,55,0,0" />

您将为setter属性调用Selected.KodP。 这就是你如何得到这个活动。

答案 1 :(得分:1)

由于Alexy has already said在绑定中使用Mode.TwoWay,因此您可以在属性设置器中执行检查,如下所示:

public string KodP
{
    get { return ... }
    set
    {
        if(value.Length >= 5)
        {
            ...
        }

        // Set the value to your field / database etc.
    }
}

使用此方法,不需要调用任何事件,因为您可以直接在属性设置器中执行检查/调用方法等。