gpt4 book ai didi

C# WPF - DataGridComboBoxColumn ItemsSource

转载 作者:行者123 更新时间:2023-11-30 15:58:39 27 4
gpt4 key购买 nike

我目前正在努力使用 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 中查找 ToolType 并将引用的类型显示为选定项的任何想法?

提前致谢。

最佳答案

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

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

如果您有一个 ToolTypeId 属性,您将使用 SelectedValuePath 绑定(bind)到它:

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 -- 这是该属性绑定(bind)的默认设置,无论如何你都会得到它)。

关于C# WPF - DataGridComboBoxColumn ItemsSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42865939/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com