2015-10-22 3 views
0

У меня есть UserControl с одной Textbox внутри сетки, как это:Проверка свойства зависимостей с INotifyDataErrorInfo

<TextBox Text="{Binding Username}"></TextBox> 

Код фоновым от UserControl реализует INotifyDataErrorInfo и INotifyPropertyChanged. Это как мой код-за выглядит (помимо указанных выше реализаций интерфейса)

public TestControl() 
{ 
    InitializeComponent(); 
    this.DataContext = this; 
} 

private string _username; 
public string Username 
{ 
    get { return _username; } 
    set 
    { 
     _username = value; 
     if (_username.Length < 3) 
      SetErrors("Username", new List<string> { "Usernames should be at least 3 characters long" }); 
     OnPropertyChanged("Username"); 
    } 
} 

Где SetErrors это просто функция, которая добавляет ошибку в IEnumerable которой INotifyDataErrorInfo.GetErrors вернется. Это работает очень хорошо. Когда я пишу текст менее 3 символов, текстовое поле становится красным. Это именно то, чего я ожидаю.

Теперь я хочу, чтобы режим просмотра MainWindow устанавливал это текстовое поле. Для этого поле Username должно быть свойством зависимостей, поэтому я могу привязываться к нему. Но проблема в том, что я не могу подтвердить это сейчас. Я сделал свойство зависимостей и попытался проверить его на ValidateValueCallback, но члены INotifyDataErrorInfo не являются статическими. Поэтому я не могу связаться с ними. Что мне делать?

ответ

0

Место Имя пользователя в MainViewModel и внутри UserControl связываются с ним, используя RelativeSource связывания как

"{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=DataContext.Username}" 

Вы можете заменить указание явное имя с CallerMemberName атрибута.

EDIT
При определении свойства зависимостей можно определить событие, которое будет поднятым всякий раз, когда происходит изменение-значения. В качестве параметра он ссылается на класс, в котором он определен, что касается вашего проекта, это будет ваш UserControl. Затем вы можете вызвать любой метод на этом объекте, не обязательно статически. После кода изображает концепцию, а не точное решение, настроить его вашему требованию:

public static readonly DependencyProperty PropertyTypeProperty = DependencyProperty.Register(
     "PropertyType", typeof (propertyType), typeof (PasswordBoxDP), new PropertyMetadata((x, y) => 
     { 
      var userControlClass = x as UserControlClass; 
      userControlClass.Validate(); 
     })); 

    private void Validate() 
    { 

    } 

Кстати, связывание в вашем случае не будет работать. Вы определили DataContext, ссылаясь на него, поэтому, когда вы установите привязку на свой ресурс зависимости, он начнет поиск в UserControl.

+0

Я хочу, чтобы моя логика проверки оставалась в моем UserControl ... Кстати, как насчет использования 'nameof' вместо' CallerMemberName'? –

Смежные вопросы