Проверка WPF не запущена - PullRequest
2 голосов
/ 16 июля 2011

У меня есть простое текстовое поле и кнопка в форме WPF.Когда я нажимаю кнопку, открывается OpenFolderDialog, и я выбираю папку.Этот SelectedPath затем отображается в текстовом поле.Все это прекрасно работает.

Тогда я решил, что хочу проверить текстовое поле, чтобы проверить, существует ли каталог, потому что вы можете просто вставить некоторый путь в текстовое поле.Когда моя программа запускается, текстовое поле показывает красную рамку вокруг нее, потому что проверка видит пустое текстовое поле.Пока я могу жить с этим.

Есть две проблемы:

  1. Когда я выбираю допустимую папку в диалоговом окне, PropertyChnged запускается, но имеет значение null и, следовательно, проверканикогда не работает, и красная граница все еще отображается.
  2. Когда я просто вставляю в него действительный каталог, ничего не запускается, а красная рамка все еще отображается.

Что я делаю не так?

Ниже моего кода.Я новичок в WPF, поэтому я ценю любую помощь, которую я могу получить.

<TextBox Grid.ColumnSpan="2" Grid.Row="1" x:Name="textBoxFolder" Margin="2,4">
  <TextBox.Text>
    <Binding Path="this.MovieFolder" UpdateSourceTrigger="PropertyChanged">
      <Binding.ValidationRules>
        <!--  Validation rule set to run when binding target is updated. -->
        <Rules:MandatoryInputRule ValidatesOnTargetUpdated="True" />
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>

А вот мой код c #:

public partial class MainWindow : Window, INotifyPropertyChanged
{
  private string _movieFolder;
  public string MovieFolder
  {
    get { return _movieFolder; }
    set
    {
      _movieFolder = value;
      OnNotifyPropertyChanged("MovieFolder");
    }
  }

  public MainWindow()
  {
    InitializeComponent();
    //textBoxFolder.DataContext = MovieFolder;

  }


  public event PropertyChangedEventHandler PropertyChanged;
  private void OnNotifyPropertyChanged(string propertyName)
  {
    if (PropertyChanged != null)
    {
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
  }

  private void buttonSearchFolder_Click(object sender, RoutedEventArgs e)
  {
    FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
    folderBrowserDialog.ShowDialog();

    MovieFolder = folderBrowserDialog.SelectedPath;
    textBoxFolder.Text = MovieFolder;
  }

  private void MenuItemClose_Click(object sender, RoutedEventArgs e)
  {
    this.Close();
  }

  private void Window_Loaded(object sender, RoutedEventArgs e)
  {

  }
}
public class MandatoryInputRule : ValidationRule
{
  public override ValidationResult Validate(object value, CultureInfo cultureInfo)
  {
    if (value != null)
    {
      string input = value as string;

      if (Directory.Exists(input))
        return new ValidationResult(true, null);
    }

    return new ValidationResult(false, "Not a valid folder.");
  }
}

1 Ответ

2 голосов
/ 16 июля 2011

Ваш путь привязки неверен, вы не можете связать через this (он будет искать свойство с именем this).Это работает, как и ожидалось, если привязка верна.

...