为自定义DependencyProperty手动调用OnPropertyChanged

时间:2015-02-11 18:09:51

标签: c# wpf dependency-properties

所以我有一个像这样的自定义DependencyProperty:

public class PatientLookUp : TextBox
{
    public static readonly DependencyProperty PatientProperty = DependencyProperty.Register("Patient", typeof(Patient), typeof(PatientLookUp), new FrameworkPropertyMetadata { BindsTwoWayByDefault = true });

    public Patient Patient
    {
        get { return (Patient)GetValue(PatientProperty); }
        set { SetValue(PatientProperty, value); }
    }

    //some logic for getting the Patient...
}

编辑:它在CustomControl中定义。使用此CustomControl的另一个控件绑定Patient属性并侦听其已更改的事件。问题是,我做了一些网络请求的东西,如果我得到一个空的患者,我仍然想要通知另一个控件CustomControl已经做了它的东西,即使患者没有真正改变。 所以现在我想手动调用PropertyChanged事件。有没有办法做到这一点?

希望你能帮助我,谢谢。

Edit2:我的XAML绑定患者(缩短):

<Window Name="MyWindow">
    <Grid>
        <llc:PatientLookUp Patient="{Binding Patient}" MaxLength="10" Text="{Binding SocialSecurityNumber}" />
    </Grid>
<Window>

现在我需要通知MyWindow的ViewModel,以防PatientLookUp的Patient对象发生变化。 LookUp按下回车键时触发了请求逻辑。请求完成后,我想通知MyWindow的ViewModel,即使它找不到任何人,但该值仍为null。

2 个答案:

答案 0 :(得分:1)

您从标准的WPF TextBox派生出来并放置一些完全不合适的东西。

你以非常不方便的方式接近这一点。

相反:使用常规TextBox,绑定到PatientSearchViewModel.SearchString,当更改SearchString时,触发搜索(从ViewModel),如果找到,则设置PatientSearchViewModel.Patient属性和{{1}这样就可以通知UI更改。

你是这样的:

NotifyPropertyChange()

虽然最简单方便的方法是:

DataModel -> View -> ViewModel

答案 1 :(得分:0)

您的类需要从INotifyPropertyChanged接口继承并实现它的类。完成后,您应该可以在属性集上调用OnPropertyChanged方法。

继承INotifyPropertyChanged:

public partial class MainWindow : INotifyPropertyChanged

实施INotifyPropertyChanged:

public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    var handler = PropertyChanged;
    if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}

调用NotifyPropertyChanged:

public Patient Patient
{
    get { return (Patient)GetValue(PatientProperty); }
    set
    {
        SetValue(PatientProperty, value);
        OnPropertyChanged();
    }
}