gpt4 book ai didi

wpf - 这个 DataGridComboBoxColumn 绑定(bind)语法有什么问题?

转载 作者:行者123 更新时间:2023-12-04 18:09:29 24 4
gpt4 key购买 nike

我找到了这个问题的许多答案,但我似乎无法正确使用语法。鉴于解释here,我已经尝试了我能想到的所有逻辑组合和我发现的许多其他人,但三周后它仍然让我望而却步。我只需要获得正确的 XAML 语法。

类:(为简单/保密而重命名)

UserControl1 - 包含三个全局列表,分别称为 Streets、Houses 和 Cars

街道 - 包含两个仅关联房屋和汽车的列表,称为 MyHouses 和 MyCars

House - 显示在 DataGrid 中,其中一列是 DataGridComboboxColumn,用于选择该 House 与哪条街道相关联。在其中声明了一个名为 Street 的 Street 属性,以跟踪这一点并在 get/set 中进行其他计算。

Car - 显示在 DataGrid 中,其中一列是 DataGridComboboxColumn,用于选择这辆 Car 与哪条街道相关联。在其中声明了一个名为 Street 的 Street 属性,以跟踪这一点并在 get/set 中进行其他计算。

如果需要,我可以重构后面的代码以匹配上面的代码并发布。

XAML

<DataGrid ItemsSource="{Binding Streets, Mode=TwoWay}">
<DataGrid.Columns>
<DataGridTextColumn Header="Street" Binding="{Binding StreetID, Mode=TwoWay}"/>
</DataGrid.Columns>
</DataGrid>
<DataGrid ItemsSource="{Binding Cars, Mode=TwoWay}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding CarID, Mode=TwoWay}"/>
<DataGridComboBoxColumn
ItemsSource="{Binding Streets, RelativeSource={RelativeSource FindAncestor,AncestorType=UserControl1}, Mode=OneWay}"
SelectedItemBinding="{Binding Street}"
SelectedValue="{Binding StreetID}"
SelectedValuePath="StreetID"
DisplayMemberPath="StreetID">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Streets, RelativeSource={RelativeSource FindAncestor,AncestorType=UserControl1}, Mode=OneWay}"/>
<Setter Property="IsReadOnly" Value="True"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Streets, RelativeSource={RelativeSource FindAncestor,AncestorType=UserControl1}, Mode=OneWay}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
<DataGrid ItemsSource="{Binding Houses, Mode=TwoWay}">
<!--copy of Cars with changed names-->
</DataGrid>

最佳答案

如果我理解您正在尝试正确执行的操作,我认为这就是您所追求的(基于您描述中的模型):

请注意,由于我的模型,我的一些变量的名称略有不同,例如用户控件

<DataGridComboBoxColumn 
SelectedItemBinding="{Binding Street}"
DisplayMemberPath="StreetName">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Streets, RelativeSource={RelativeSource FindAncestor,AncestorType=UserControl}, Mode=OneWay}"/>
<Setter Property="IsReadOnly" Value="True"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Streets, RelativeSource={RelativeSource FindAncestor,AncestorType=UserControl}, Mode=OneWay}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>

对我来说,这会在数据网格中显示我的Cars,包含所有相关列和可选择的街道(您可以以类似的方式适应Houses)。

我想您已经读过,DataGridComboBoxColumn 在解析其 DataContext 时有点奇怪。当您尝试将 ItemsSource 设置在 DataGridComboBoxColumn 的顶部时,会造成混淆。

这应该适用于您描述的示例(我用 CarsHouses 建模,有一个 Street 对象作为跟踪属性,而不是 ID)。

如果您决定要合并 SelectedValue 并使用返回的 Street ID(作为 ID 属性存储在 Car House,我想你必须在你的样式模板中使用另一个 setter 来完成它。

编辑:我使用的模型(在 XAML 中将 Datacontext 设置为 self)。 N.B 对象不会相互跟踪(因为我不确定你有什么设置)。

public partial class UserControl1 : UserControl
{
public List<Street> Streets { get; set; }
public List<House> Houses { get; set; }
public List<Car> Cars { get; set; }

public UserControl1()
{
Streets = new List<Street>();
Houses = new List<House>();
Cars = new List<Car>();

Street streetOne = new Street() { StreetID = 1, Name = "Street One" };
Street streetTwo = new Street() { StreetID = 1, Name = "Street Two" };
Car carOne = new Car() { CarID = 1, Name = "KITT", MyStreet = streetOne };
Car carTwo = new Car() { CarID = 2, Name = "Car 2", MyStreet = streetTwo };
House houseOne = new House() { HouseID = 1, Name = "House 1", MyStreet = streetOne };

InitializeComponent();

streetOne.MyCars.Add(carOne);
streetOne.MyHouses.Add(houseOne);
streetTwo.MyCars.Add(carTwo);
Cars.Add(carOne);
Cars.Add(carTwo);
Houses.Add(houseOne);
Streets.Add(streetOne);
Streets.Add(streetTwo);
}
}

public class Car
{
public int CarID { get; set; }
public string Name { get; set; }
private Street _street;
public Street MyStreet
{
get { return this._street; }
set { this._street = value; }
}
}

public class House
{
public int HouseID { get; set; }
public string Name { get; set; }
public Street MyStreet { get; set; }
}

public class Street
{
public int StreetID { get; set; }
public string Name { get; set; }
public List<House> MyHouses { get; set; }
public List<Car> MyCars { get; set; }

public Street()
{
MyHouses = new List<House>();
MyCars = new List<Car>();
}
}

关于wpf - 这个 DataGridComboBoxColumn 绑定(bind)语法有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17977997/

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