WPF - ValidationRule не вызывается

Я получил этот Xaml TextBlock:

<TextBlock VerticalAlignment="Center">
       <TextBlock.Text>
             <Binding Path="FilesPath" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
                  <Binding.ValidationRules>
                        <viewModel:ExtensionRule></viewModel:ExtensionRule>
                   </Binding.ValidationRules>
              </Binding>
         </TextBlock.Text>
 </TextBlock>

В модели представления:

    private string _filesPath;
    public string FilesPath
    {
        set 
        { 
            _filesPath = value;
            OnPropertyChange("FilesPath");
        }
        get { return _filesPath; }
    }

    private void OnPropertyChange(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

и правило проверки таково:

public class ExtensionRule : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        string filePath = String.Empty;
        filePath = (string)value;
        if (String.IsNullOrEmpty(filePath))
        {
            return new ValidationResult(false, "Must give a path");
        }

        if (!File.Exists(filePath))
        {
            return new ValidationResult(false, "File not found");
        }
        string ext = Path.GetExtension(filePath);
        if (!ext.ToLower().Contains("txt"))
        {
            return new ValidationResult(false, "given file does not end with the \".txt\" file extenstion");
        }
        return new ValidationResult(true, null);
    }
}

и свойство FilesPath обновляется другим событием: (vm - это переменная viewModel)

private void BrowseButton_Click(object sender, RoutedEventArgs e)
    {
        // Create OpenFileDialog 
        OpenFileDialog dlg = new OpenFileDialog();

        // Set filter for file extension and default file extension 
        dlg.DefaultExt = ".txt";
        dlg.Filter = "txt Files (*.txt)|*.txt";

        // Display OpenFileDialog by calling ShowDialog method 
        bool? result = dlg.ShowDialog();

        // Get the selected file name and display in a TextBox 
        if (result == true)
        {
            // Open document 
            string filename = dlg.FileName;
            vm.FilesPath = filename;
        }
    }

Почему ValidationRule не вызывается, когда я выбираю файл в диалоговом окне файла?


person Yonatan Nir    schedule 29.03.2014    source источник


Ответы (1)


В соответствии с этим Статья библиотеки MSDN проверяется только при передаче данных из целевого свойства привязки (TextBlock.Text в вашем случае) в исходное свойство (ваше свойство vm.FilesPath) — цель здесь — проверить ввод пользователя, например, из TextBox. Чтобы предоставить обратную связь проверки от исходного свойства к элементу управления, владеющему целевым свойством (элемент управления TextBlock), ваша модель представления должна реализовать либо IDataErrorInfo, либо INotifyDataErrorInfo.

person Grx70    schedule 29.03.2014
comment
Возможно ли, что VS2010 не поддерживает INotifyDataErrorInfo, а только IDataErrorInfo? - person Yonatan Nir; 30.03.2014
comment
@YonatanNir — INotifyDataErrorInfo был представлен только в .NET 4.5, а VS2010 поддерживает только версии платформы до .NET 4.0, поэтому он будет недоступен. - person Grx70; 30.03.2014
comment
но я не понимаю, почему это все равно не работает. Я понимаю, что INotifyDataErrorInfo должен использоваться при изменении свойства напрямую, а не через привязку, но все же свойство реализует INotifyPropertyChanged. Разве это не означает, что оно должно работать с validationRule? Так как с INotifyDataErrorInfo правило вообще не будет использоваться - person Yonatan Nir; 02.04.2014