2015-02-11 1 views
0

Так я получил пользовательский DependencyProperty как это:вручную вызов OnPropertyChanged для пользовательского 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... 
} 

Edit: Это определяется в CustomControl. Другой элемент управления, использующий этот CustomControl, связывает свойство Patient и слушает его измененное событие. Проблема в том, что я делаю некоторые сетевые запросы, и если я получаю нулевой Пациент в результате, я все равно хочу уведомить другой элемент управления, который CustomControl выполнил, даже если Пациент действительно не изменился. Итак, теперь я хочу вызвать событие PropertyChanged вручную. Есть какой-либо способ сделать это?

Надеюсь, вы можете мне помочь, спасибо.

Edit2: Мой XAML связывание пациента (укороченный):

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

Теперь мне нужно, чтобы уведомить ViewModel о MyWindow в случае объект пациента в PatientLookUp изменилось. LookUp имеет логику запроса, нажатую на клавишу ввода. По завершении запроса я хочу уведомить ViewModel MyWindow, даже если он не смог найти никого, и значение по-прежнему равно null.

+0

'Мне это нужно ссылаться, даже если значение не меняется. '- Что вы хотите вызвать? –

+1

Вы не можете этого сделать. И кажется, что вы смешиваете свою бизнес-модель в пользовательском интерфейсе, вообще не должно быть такого свойства «Пациент» в пользовательском интерфейсе. Что вы на самом деле пытаетесь сделать? –

+0

@HighCore см. Обновление. –

ответ

1

Вы вытекающих из стандартного WPF TextBox и положить что-то, что совершенно неуместен.

Вы приближаетесь к этому очень неудобно.

Вместо: использовать обычный TextBox, привязку к PatientSearchViewModel.SearchString и когда SearchString изменяется, огонь поиска (от ViewModel) и если он найден, установите PatientSearchViewModel.Patient свойство и NotifyPropertyChange() так, что пользовательский интерфейс уведомляется об изменении.

Ты так:

DataModel -> View -> ViewModel 

в то время как наиболее простой и удобный подход заключается в следующем:

DataModel -> ViewModel -> View 
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(); 
    } 
}