WPF应用程序中的FolderBrowserDialog抛出应用程序异常而不是绑定异常

时间:2013-03-28 17:21:01

标签: c# wpf folderbrowserdialog errortemplate

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

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

  1. 如果文件夹不存在且无法访问。
  2. 如果用户选择作为系统文件夹的文件夹。对于此示例,我将值硬编码为@"c:\windows\boot"
  3. 我注意到的是:如果我输入一个不存在的文件夹,我将获得允许我设置错误模板的绑定异常。

    但是,如果我选择一个用户无权访问的驱动器,或者我选择了@"c:\windows\boot",我将获得一个异常,该异常要么在App.xaml unhandle异常处捕获,要么就是你有一个try catch (文件夹设置的地方)它将被捕获。我如何将其作为绑定异常?在我决定将它作为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);
                }
            }
        }
    

1 个答案:

答案 0 :(得分: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();
}

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