gpt4 book ai didi

c# - 如何将 DataGridComboBoxColumn 的数据上下文更改为特定类?

转载 作者:太空宇宙 更新时间:2023-11-03 14:59:47 26 4
gpt4 key购买 nike

我是 WPF 的新手,我遇到了以下情况:

 class Person{
string Name;
List<Address> ListAddresses;
}

我有一个带有 ItemsSource 的 DataGrid 作为 ObservableCollection<Person> .此合集在MainViewModel类。

我想创建一个 DataGridComboBoxColumn与地址。

<DataGrid ItemsSource="{Binding Persons, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
<DataGrid.Columns>
<DataGridComboBoxColumn ItemsSource="{Binding Path=ListAddresses, RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type local:Person}}}">
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>

我收到以下错误:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='PersonApp.UL.ViewModels.Person', AncestorLevel='1''. BindingExpression:Path=ListAddresses; DataItem=null; target element is 'DataGridComboBoxColumn' (HashCode=11440639); target property is 'ItemsSource' (type 'IEnumerable')

最佳答案

DataGridComboBoxColumn 会给您带来很多问题。试试这个:

    <DataGridTemplateColumn Header="Something"
SortMemberPath="[SelectedAddress].[property from Address class]">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding ListAddresses}"
SelectedItem="{Binding SelectedAddress, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedValuePath="[SelectedAddress].[property from Address class]"
DisplayMemberPath="[property from Address class (like Name)]" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

您还应该在 Person 类中包含 SelectedAddress 属性,以存储在 ComboBox 中选择的 Address >。

绑定(bind)到 ItemsSource 范围内的属性(在本例中是您绑定(bind)到 DataGrid 的属性)不需要 RelativeSource 绑定(bind),这就是您收到错误的原因。 RelativeSource 是必需的,以防您将 DataGrid.ItemsSource 设置为例如 PeopleList 并且您想要绑定(bind)您的(位于此 内DataGrid) ComboBox.ItemsSource 到您的 ViewModel 中的属性,但不在您的 PeopleList 中。

绑定(bind)到 ComboBox 的另一件事是,如果将 ItemsSource 绑定(bind)到 strings 以外的对象集合,则必须设置 DisplayMemberPath 到对象中的一个属性,以使控件显示正确的标题。因此,例如,如果您正在绑定(bind)对象 Car 并且它有一个名为 Namestring 类型属性,您应该设置 DisplayMemberPathName 以使您的控件显示 Car.Names 列表(选择一个仍会导致选择整个对象,而不仅仅是 Name属性)。

关于c# - 如何将 DataGridComboBoxColumn 的数据上下文更改为特定类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46784718/

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