0

您好,我正在使用System.Windows.Forms.FolderBrowserDialog我的WPF application来选择用户计算机中的文件夹。所选文件夹显示在 a 中TextBox,并在视图模型中进行验证。

我正在尝试在以下情况下显示无效文件夹Error Template消息:TextBox

  1. 如果文件夹不存在且不可访问。
  2. 如果用户选择的文件夹是系统文件夹。对于此示例,我将值硬编码为@"c:\windows\boot".

我注意到的是:如果我键入一个不存在的文件夹,我将得到允许我设置错误模板的绑定异常。

但是,如果我选择了一个用户无权访问的驱动器,或者我选择了@"c:\windows\boot"我将得到一个异常,该异常要么在App.xamlunhandle 异常中被捕获,要么如果你有一个 try catch(设置文件夹的位置),它将在那里被捕获。我怎样才能将其作为绑定异常?在我决定将它作为尝试捕获之前,我想了解是否有任何方法可以将其作为绑定异常(这样可以节省点击!)。

这是代码:

public class MainWindowViewModel : INotifyPropertyChanged
    {
        public MainWindowViewModel()
        {
        }

        private string _folderName;
        public string FolderName
        {
            get { return _folderName; }
            set
            {
                _folderName = value;

                if (!string.IsNullOrEmpty(_folderName))
                    InvalidValidFolder();

                if (!string.IsNullOrEmpty(_folderName))
                    ValidateFolder();

                OnPropertyChanged("FolderName");
            }
        }

        private void ValidateFolder()
        {
            if (!Directory.Exists(FolderName))
                throw new Exception("Folder does not exist");
        }

        private void InvalidValidFolder()
        {
            if (FolderName.ToLower() == @"c:\windows\boot")
                throw new Exception("This folder is restricted.");
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

    }

我只有MainWindowMainWindowViewModel

<DockPanel>
        <Grid DockPanel.Dock="Top" Width="Auto" Margin="50">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>
            <TextBox x:Name="textBox" Text="{Binding FolderName, ValidatesOnExceptions=True, ValidatesOnDataErrors=True}" Margin="0,0,0,5" Grid.Column="0" />
            <Button Grid.Column="1"
                        Margin="5,0,5,0"
                        Width="35"
                        Content="..."
                        Click="LocationChoose_Click"/>
        </Grid>
        <Grid></Grid>
    </DockPanel>

代码隐藏

public partial class MainWindow : Window
    {
        public MainWindowViewModel ViewModel {get; set;}
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = ViewModel = new MainWindowViewModel();
        }

        private void LocationChoose_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                FolderBrowserDialog folderDlg = new FolderBrowserDialog();
                folderDlg.ShowDialog();
                ViewModel.FolderName = folderDlg.SelectedPath;

            }
            catch (Exception ex)
            {
                System.Windows.MessageBox.Show(ex.Message);
            }
        }
    }
4

1 回答 1

0

如果有人感兴趣,请得到答案。

我将后面的代码更改为:

private void LocationChoose_Click(object sender, RoutedEventArgs e)
{
    FolderBrowserDialog folderDlg = new FolderBrowserDialog();
    folderDlg.ShowDialog();
    //ViewModel.FolderName = folderDlg.SelectedPath;
    textBox1.Text = folderDlg.SelectedPath;
    BindingExpression exp = this.textBox1.GetBindingExpression(System.Windows.Controls.TextBox.TextProperty);
    exp.UpdateSource();
}

这将其视为绑定异常。现在我可以应用我的模板了。谢谢你的时间。

于 2013-03-28T19:20:51.580 回答