我无法在多值转换器中获取视图模型的 属性

I can't get the property of the view model in the multi value converter

我有一个DataGrid。我想决定何时折叠和显示列。

这是我的代码:

<UserControl.Resources>
   <ResourceDictionary>
      <FrameworkElement x:Key="ProxyElement" DataContext="{Binding}" />
   </ResourceDictionary>
<UserControl.Resources>
<DataGridTextColumn.Visibility>
   <MultiBinding Converter="{StaticResource MyMultiValueConverter}">
      <Binding Source="{StaticResource ProxyElement}" Path="DataContext.MyPropertyInViewModel" />
      <Binding Source="1"/>
   </MultiBinding>
</DataGridTextColumn.Visibility> 
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
   //Do  the conversion
}

我需要代理元素从不属于可视化树的元素访问视图模型。

MultiBinding中,第二个绑定有效。在转换器中,我收到值 1,但问题出在第一个元素上。我没有得到视图模型的 属性,它是 string。我得到一个 DependencyProperty.UnsetValue.

如何将视图模型的 属性 传递给多值转换器?

ProxyElement 不会绑定 Resources 中的数据上下文,因为它不是可视化树的一部分。要使其工作,请在可视化树中的任何位置定义 FrameworkElement,例如就像下面的 GridDataContext 是继承的,但您也可以显式设置它。设置代理的VisibilityCollapsed,这样就隐藏了

<Grid>
   <!-- ...grid definitions. -->
   <FrameworkElement Grid.Row="42" x:Name="ProxyElement" Visibility="Collapsed"/>
</Grid>

使用 x:Reference 引用它,因为 ElementName 绑定仅在可视化树中有效,但列不是它的一部分。

<DataGridTextColumn.Visibility>
   <MultiBinding Converter="{StaticResource MyMultiValueConverter}">
      <Binding Source="{x:Reference ProxyElement}" Path="DataContext.InitialDepositAmount"/>
      <Binding Source="1"/>
   </MultiBinding>
</DataGridTextColumn.Visibility>

更好的方法是使用 Freezable 作为绑定代理。那些甚至可以在可视化树之外访问数据上下文。请参阅此 related post,其中显示了一种使用自定义 BindingProxy 的方法,该方法也适用于 Resources 而没有 x:Reference