C# 未激发WPF验证

C# 未激发WPF验证,c#,wpf,xaml,data-binding,validation,C#,Wpf,Xaml,Data Binding,Validation,我在WPF表单上有一个简单的文本框和一个按钮。当我点击按钮时,一个OpenFolderDialog打开,我选择了一个文件夹。然后,所选路径将显示在文本框中。这一切都很好 然后我决定要对文本框进行验证,以检查目录是否存在,因为您也可以在文本框中粘贴一些路径。 当我的程序启动时,文本框周围会显示一个红色边框,因为验证会看到一个空文本框。现在我可以接受了 有两个问题: 当我通过对话框选择一个有效的文件夹时,会触发PropertyChnged,但为null,因此验证不会运行,红色边框仍然显示。 当我只是

我在WPF表单上有一个简单的文本框和一个按钮。当我点击按钮时,一个OpenFolderDialog打开,我选择了一个文件夹。然后,所选路径将显示在文本框中。这一切都很好

然后我决定要对文本框进行验证,以检查目录是否存在,因为您也可以在文本框中粘贴一些路径。 当我的程序启动时,文本框周围会显示一个红色边框,因为验证会看到一个空文本框。现在我可以接受了

有两个问题:

  • 当我通过对话框选择一个有效的文件夹时,会触发PropertyChnged,但为null,因此验证不会运行,红色边框仍然显示。
  • 当我只是在其中粘贴一个有效的目录时,根本不会触发任何操作,并且仍然会显示红色边框。 我做错了什么

    下面是我的代码。我是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>
    

    您的绑定路径错误,无法通过
    this
    进行绑定(它将查找名为
    this
    的属性)。如果绑定是正确的,它就可以正常工作。

    sry对于混乱的代码,我无法让它正确显示。如果只是这么简单。。。我以前试过,只是用“MovieFolder”作为路径,但结果是一样的。这就是为什么我试着用这个。在此之前,因为prop MovieFolder是主窗口中的一个属性。只有
    MovieFolder
    也是错误的,除非您将DataContext设置为您的窗口,而您没有设置。好的,您能告诉我将其放置在何处吗?谢谢你的帮助!只需添加
    DataContext=this到窗口的构造函数,并使用
    MovieFolder
    作为
    Binding.Path
    。你可能还想读这本书,因为你在这个问题上似乎有些动摇。
    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.");
      }
    }