【问题标题】:Get DataGridColumns Binding Path from DataGridColumnHeader with MultiBinding in DataGridHeader Style使用 DataGridHeader 样式中的 MultiBinding 从 DataGridColumnHeader 获取 DataGridColumns 绑定路径
【发布时间】:2020-01-24 23:51:18
【问题描述】:

在我的 DataGridColumnHeaderStyle 中,我有以下 MultiBinding:

        <Setter Property="Command" Value="{Binding DataContext.AddFilterColumnCommand, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
        <Setter Property="CommandParameter">
            <Setter.Value>
                <MultiBinding Converter="{StaticResource MultiCommandParameterConverter}">
                    <Binding Path="Content" RelativeSource="{RelativeSource Mode=Self}" />
                    <Binding Path="Column.Binding.Path.Path" RelativeSource="{RelativeSource Mode=Self}" />
                </MultiBinding>
            </Setter.Value>
        </Setter>

我在使用第二个绑定时遇到了问题。它总是返回{{DependencyProperty.UnsetValue}}

但是,如果在应用程序运行时,我将 RelativeSource 模式更改为其他模式,然后再返回它就可以正常工作。

我一直在为这个问题摸不着头脑,看到其他 SO 问题没有尽头,使用 Google 我似乎无法找到为什么会这样或如何克服它的答案。

编辑: 这是我的转换器代码,以防万一

class MultiCommandParameterConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    { return values.Clone(); }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    { return new object[] { value }; }
}

【问题讨论】:

    标签: wpf xaml multibinding commandparameter


    【解决方案1】:

    根据您对绑定的需要,您可以执行以下操作 -

    <Setter.Value>
        <MultiBinding Converter="{StaticResource MultiCommandParameterConverter}">
            <Binding Path="Content" RelativeSource="{RelativeSource Mode=Self}" />
            <Binding Path="DisplayIndex" RelativeSource="{RelativeSource Mode=Self}" />
            <Binding Path="DataContext" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=DataGrid}" />
        </MultiBinding>
    </Setter.Value>
    

    列标题的问题是与该列关联的绑定无法通过标题的 Datacontext 获得,因此您只能做这样的事情。或者,如果您知道您将始终访问的属性,您也可以执行以下操作 -

    <Binding Path="DataContext.PropertyX" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=DataGrid}" />
    

    【讨论】:

    • 我设法通过在 DataGrid 本身而不是在 UserControl.Resources 中设置 ColumnHeaderStyle 来解决它,现在它似乎工作正常。
    【解决方案2】:

    好吧,我似乎已经解决了。

    我没有在我的&lt;UserControl.Resources&gt; 中设置样式,而是在&lt;DataGrid&gt; 本身中应用了它。

    我一直在 &lt;UserControl.Resources&gt; 中设置我的样式,因此它们适用于 UserControl 上的所有控件,但在这种情况下,我似乎需要在实际的 &lt;DataGrid&gt; 中设置 ColumnHeaderStyle 才能使 MultiBinding 起作用。

    我决定将这个问题作为我的答案,而不是仅仅删除这个问题,以供任何可能偶然发现此问题的人使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-01
      • 2019-06-03
      • 1970-01-01
      • 2011-05-18
      • 2014-12-08
      • 2011-04-04
      • 2019-09-07
      • 1970-01-01
      相关资源
      最近更新 更多