C# WPF - DataGridComboBoxColumn的ItemsSource

3
我目前在C# WPF中苦于DataGridComboBoxColumn。
我有一个名为ToolModel的类。
class ToolModel
{
    public long Id { get; set; }
    public string Number { get; set; }
    public string Name { get; set; }
    public string Coating { get; set; }
    public bool Thread { get; set; }
    public string Kind { get; set; }
    public ToolTypeModel Type { get; set; }
}

和类ToolTypeModel

public class ToolTypeModel
{
    public long Id { get; set; }
    public string Name { get; set; }
}

数据被存储到数据库中,并加载到我的ViewModel中。
class ToolsViewModel
{
    public ObservableCollection<ToolModel> Tools { get; set; }
    public ObservableCollection<ToolTypeModel> ToolTypes { get; set; }

    public ToolsViewModel()
    {
        Tools = new ObservableCollection<ToolModel>(ToolModel.GetTools());
        ToolTypes = new ObservableCollection<ToolTypeModel>(ToolTypeModel.GetToolTypes());
    }
}

我想在DataGrid中显示数据,并尝试添加一个DataGridComboBoxColumn来选择相应工具的ToolType。因此,我添加了以下XAML定义(这已经是一种解决方法-但这是我能够使它接近工作的唯一方法):
 <DataGrid x:Name="ToolsDataGrid" ItemsSource="{Binding Tools}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Nummer" Binding="{Binding Number}" />
            <DataGridComboBoxColumn 
                    Header="Typ"
                    SelectedValueBinding="{Binding Type, Mode=TwoWay}" 
                    SelectedValuePath="Id"
                    DisplayMemberPath="Name">

                <DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="{x:Type ComboBox}">
                        <Setter Property="ItemsSource" Value="{Binding Path=DataContext.ToolTypes, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
                    </Style>
                </DataGridComboBoxColumn.ElementStyle>
                <DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="{x:Type ComboBox}">
                        <Setter Property="ItemsSource" Value="{Binding Path=DataContext.ToolTypes, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
                    </Style>
                </DataGridComboBoxColumn.EditingElementStyle>
            </DataGridComboBoxColumn>
        </DataGrid.Columns>
    </DataGrid>

它显示了所有的ToolTypes元素,但是没有我所选的工具引用的元素。
有什么想法可以在ComboBoxColumn中查找ToolTypes并将引用的类型显示为选定项吗?
提前感谢。
1个回答

5

SelectedValuePath是组合框项目属性的路径,该路径将通过SelectedValueBinding进行绑定。因此,SelectedValueBinding必须绑定到相同类型的属性。

<DataGridComboBoxColumn 
    Header="Typ"
    SelectedValueBinding="{Binding Type, Mode=TwoWay}" 
    SelectedValuePath="Id"
    DisplayMemberPath="Name">

如果您有一个名为ToolTypeId的属性,您可以使用SelectedValuePath来绑定它:
class ToolModel
{
    public long Id { get; set; }
    public string Number { get; set; }
    public string Name { get; set; }
    public string Coating { get; set; }
    public bool Thread { get; set; }
    public string Kind { get; set; }

    //  Like so
    public long ToolTypeId { get; set; }

    public ToolTypeModel Type { get; set; }
}

在 XAML 中:

<DataGridComboBoxColumn 
    Header="Typ"
    SelectedValueBinding="{Binding ToolTypeId}" 
    SelectedValuePath="Id"
    DisplayMemberPath="Name">

但我认为这不是你想要的。我认为你很清楚地想要在Type属性中获得一个实际的ToolTypeModel实例。

所以这应该可以工作(我刚刚测试过)。请注意:覆盖Equals()有点冒险,因为它会更改该类的C# =!=运算符的语义,这可能会对你造成影响。

public class ToolTypeModel
{
    public long Id { get; set; }
    public string Name { get; set; }

    public override bool Equals(object obj)
    {
        return (obj is ToolTypeModel)
                    ? (obj as ToolTypeModel).Id == Id
                    : false;
    }

    public override int GetHashCode()
    {
        return Id.GetHashCode();
    }
}

XAML:

<DataGridComboBoxColumn
    Header="Type"
    SelectedItemBinding="{Binding Type}" 
    DisplayMemberPath="Name"
    >

(另外,去掉Mode=TwoWay -- 这是该属性绑定的默认设置,你会自动得到它)。

谢谢!第一种方法可行——但是这样做会同时得到ID和参考信息,我认为这不是一个令人满意的解决方案。我尝试了第二种方法,但对我来说不起作用......没有选定的项。 - johannespartin
@johannesp 哦,糟糕——绑定选定项和选定值应该没问题,并且可以同时获取两者,但在填充网格之前,您需要确保 ToolTypeId 与每个 ToolModel 上的 Type 匹配。对于第二个版本,您尝试取消注释 Equals() 覆盖了吗? - 15ee8f99-57ff-4f92-890c-b56153
仍然不起作用 :/ 我插入了SelectedItemBinding="{Binding ToolType}"和SelectedValueBinding="{Binding ToolType}"属性。我认为你指的是'ToolTypeModel'字段,我将其称为Type。无论哪种方式,都不起作用。 - johannespartin
1
好的,现在我明白了!我必须添加 SelectedItemBinding="{Binding Type}" SelectedValueBinding="{Binding Id}" SelectedValuePath="Id" - 现在它可以工作了!谢谢!! - johannespartin
1
哇,谢谢!我永远不会发现这个错误!我实现了你在编辑中的方式,并发现只有在实现Equals方法时才有效。 - johannespartin
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接