【问题标题】:How to bind property name to which column is binded to pass as command parameter如何将属性名称绑定到绑定的列以作为命令参数传递
【发布时间】:2014-05-13 07:23:27
【问题描述】:

在每个 DataGridColumnHeader 上,我都有一个用于打开弹出窗口的按钮。作为参数,它将列的绑定属性名称发送到我的 ViewModel 中的 ICommand。

这适用于任何 DataGridTextColumn,但是当涉及 DataGridComboBoxColumn 时,结构是不同的。

我将如何解决这个问题?

<Button Command="{Binding DataContext.OpenFilterCommand, 
                  RelativeSource={RelativeSource AncestorType=UserControl}}"
        CommandParameter="{Binding Column.Binding.Path.Path, 
                  RelativeSource={RelativeSource Mode=TemplatedParent}}"/>

问题列定义

<DataGridComboBoxColumn Header="Company" >
    <DataGridComboBoxColumn.ElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.CompanyCollection}"/>
            <Setter Property="IsReadOnly" Value="True"/>
            <Setter Property="SelectedValue" Value="{Binding Company}"/>
        </Style>
    </DataGridComboBoxColumn.ElementStyle>
    <DataGridComboBoxColumn.EditingElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.CompanyCollection}"/>
            <Setter Property="SelectedValue" Value="{Binding Company}"/>
        </Style>
    </DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>

【问题讨论】:

  • 在这种情况下您要传递哪个属性名称? ItemsSource 姓名或SelectedValue 姓名?
  • 公司,所以 SelectedValue 或其中任何一个。
  • 我已经添加了一个答案。看看有没有帮助。

标签: wpf xaml mvvm wpfdatagrid


【解决方案1】:

就像我在上一个问题here 中提到的那样,如何获取DataGridTextColumn 的值,我建议使用Column.Binding.Path.Path 来获取绑定属性名称。

但这在这种情况下不起作用,因为DataGridComboBoxColumn 没有任何绑定属性。如果语法像你上面提到的那个,你可以得到这样的:

对于SelectedValue,即Company

<Button Command="{Binding DataContext.OpenFilterCommand, 
                  RelativeSource={RelativeSource AncestorType=UserControl}}"
        CommandParameter="{Binding 
                   Column.EditingElementStyle.Setters[1].Value.Path.Path, 
                  RelativeSource={RelativeSource Mode=TemplatedParent}}"/>

解释

TemplatedParent (DataGridColumnHeader) --> 列 (DataGridComboBoxColumn) --> EditingElementStyle(EditingElementStyle) --> Setters(1) ( 从样式中获取第一个 setter)--> 值(Setter Value)--> 路径(PropertyPath)--> 路径(实际属性名称)

如果要获取ItemsSource 属性名称,请将Setters[1] 替换为Setters[0]

【讨论】:

    猜你喜欢
    • 2017-11-08
    • 1970-01-01
    • 2021-05-12
    • 2013-10-01
    • 2010-12-17
    • 2020-03-25
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    相关资源
    最近更新 更多