0

我是 WPF 和数据绑定的新手,所以我很容易在我的研究中遗漏一些东西,或者我一直在使用错误的搜索词(更有可能)来找到解决方案。

绑定的值似乎正在传递,而不是对对象的引用,因此当值在后面的代码中设置时,它不会得到更新。

在尝试概括 OpenFileDialog 以在选项卡控件的某些不同选项卡上有用。我创建了一个包含参数(路径、过滤器和文本框)的自定义数据对象

class OpenFileCommandParameters
{
    public string Filter { get; set; }
    public string Path { get; set; }
    public string TextBox { get; set; }
}
class OpenFileCommandParamtersConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        OpenFileCommandParameters parameters = new OpenFileCommandParameters();
        if (values[0] is string) parameters.Filter = (string)values[0];
        if (values[1] is string) parameters.Path = (string)values[1];
        if (values[2] is string) parameters.TextBox = (string)values[2];
        return parameters;
    }
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

用于传递信息的 XAML 如下所示:

<TextBox Name="ButtonTagImportFileName" Text="{Binding Path=TagImportTabVM.TbFileName}" Height="23" HorizontalAlignment="Left" Margin="83,17,0,0" VerticalAlignment="Top" Width="221" />
<Button Name="TagImportOpenFile" Content="Open File" Command="{Binding Path=OpenFileCommand}" Height="23" HorizontalAlignment="Left" Margin="342,17,0,0" VerticalAlignment="Top" Width="98" >
  <Button.CommandParameter>
      <MultiBinding Converter="{StaticResource openFileCommandParametersConverter}">
          <MultiBinding.Bindings>
              <Binding Source="XML files (*.xml)|*xml|All files (*.*)|*.*"/>
              <Binding Path="AppPath"/>
              <Binding Path="TagImportTabVM.TbFileName"/>
          </MultiBinding.Bindings>
      </MultiBinding>
  </Button.CommandParameter>

文本框和打开文件按钮都绑定到相同的字符串属性。

属性通过执行命令更新

private void OpenFile(object parameter)
    {
       var parameters = parameter as OpenFileCommandParameters;
       FileDialog.Filter = parameters.Filter;
       FileDialog.InitialDirectory = parameters.Path;
       if (parameters == null) return;
       var result = FileDialog.ShowDialog();
       if (result == true)
       {
           parameters.TextBox = FileDialog.SafeFileName;
       }
    }

一旦这个命令完成,我希望 TbFileName 的值与来自文件对话框的值相同。不是这种情况。从 OpenFile 块结束前的断点看。

在此处输入图像描述

我很感激你能给我的任何帮助。

4

2 回答 2

0

我相信这不起作用,因为 MultiBinding 从不尝试更新其源绑定。有可能以某种方式强制执行此操作,但是当我尝试使用时

BindingOperations.GetBindingExpression(TagImportOpenFile, Button.CommandParameterProperty)

它总是返回 null,所以我不确定绑定 CommandParameters 的方法是否可行。获取 CommandProperty 的表达式工作正常,CommandParameters 必须不同......不知何故。

我认为一种绝对可行的方法是:

a)将您的参数类转换为 ViewModel(或至少将其作为 INotifyPropertyChanged/DependencyObject 进行双向绑定),TextBox 属性可能需要重命名为“FileName”之类的东西。

b) 将此类的实例放在您的屏幕 ViewModel 上(在这种情况下为“TagImportTabVM”?),

c) 将您的 XAML 更改为以下内容:

<TextBox Name="ButtonTagImportFileName" Text="{Binding Path=OpenFileVM.FileName}" Height="23" HorizontalAlignment="Left" Margin="83,17,0,0" VerticalAlignment="Top" Width="221" />
<Button Name="TagImportOpenFile" Content="Open File" Command="{Binding Path=OpenFileCommand}" CommandParameter="{Binding OpenFileVM}" 
        Height="23" HorizontalAlignment="Left" Margin="342,17,0,0" VerticalAlignment="Top" Width="98" />

这是假设您在创建参数的新实例时不介意在代码中设置文件过滤器(因为我假设您无论如何都为 AppPath 做了类似的事情)。

于 2012-07-19T23:13:08.037 回答
0

我对这个解决方案非常满意,@一只小绵羊用他的解决方案帮助我完成了剩下的路。只是想完全结束这个问题。

我在想,因为源没有得到更新,所以我在通过代码设置值时破坏了绑定。不是这种情况。只是根本不知道值已更改,因此不知道更新源。

一旦我发现了这一点,就很容易找到如何通知系统让它知道它需要更新源。这被添加到private void OpenFile(object parameter)

BindingExpression binding = BindingOperations.GetBindingExpression(parameters.PassedTextBox, TextBox.TextProperty);
binding.UpdateSource();

这就是为了让它正确更新而添加的所有内容。

于 2012-07-30T17:19:15.300 回答