如果DataGrid中没有项目,我需要能够在代码隐藏中更改DataGrid的绑定,反之亦然。
目前看来,这是我目前的尝试:
C#:
List<Character> Characters = new List<Character>
{
new Character("Judge Dredd", Gender.Male, CharacterClass.Fighter),
new Character("Princess Xena", Gender.Female, CharacterClass.Fighter),
new Character("Hawkeye", Gender.Male, CharacterClass.Ranger),
new Character("Laura Croft", Gender.Female, CharacterClass.Ranger),
new Character("Merlin", Gender.Male, CharacterClass.Mage),
new Character("Wicked Witch of the West", Gender.Female, CharacterClass.Mage)
};
HeroBox.ItemsSource = Characters;
WPF:
<DataGrid x:Name="InvGrid"
Background="DimGray"
Grid.Column="1"
ItemsSource="{Binding ElementName=HeroBox, Path=SelectedValue.Inventory}"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridCheckBoxColumn Header="Equip"
Binding="{Binding Path=Equipped, Mode=TwoWay}"></DataGridCheckBoxColumn>
<DataGridTextColumn Header="Name"
Binding="{Binding Path=Name, Mode=TwoWay}"></DataGridTextColumn>
<DataGridTextColumn Header="Effect"
Binding="{Binding Path=Effect, Mode=TwoWay}"></DataGridTextColumn>
<DataGridTextColumn Header="Cost"
Binding="{Binding Path=Cost, Mode=TwoWay}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
尝试更改InvGrid的ItemsSource - 包括编译错误(C#):
if (InvGrid.Items.Count == 0)
{
Binding b = new Binding("HeroBox")
{
ElementName = "HeroBox",
Path = "SelectedValue.Inventory"
};
InvGrid.ItemsSource = new Binding(b);
}
else
{
InvGrid.ItemsSource = null;
}
基本上,我想在这里达到同样的效果:
ItemsSource="{Binding ElementName=HeroBox, Path=SelectedValue.Inventory}"
但在C#中。
InvGrid DataGrid从运行时随机生成的ComboBox(HeroBox)中从所选英雄的清单中提取其数据。之后,DataGrid应允许用户输入任何内容而不自动生成任何内容,但此时DataGrid随机生成清单中的新随机项,允许用户从那里更改它。
答案 0 :(得分:1)
不要绑定datagrid的itemssource。而是实现组合框的selectionchanged事件并在其中设置invgrid.itemssource = ((character)HeroBox.selectedItem).inventory
(添加必要的代码是HeroBox.selectedItem为空)
答案 1 :(得分:0)
您可以考虑绑定到类型ObservableCollection<Character>
而不是List<Character>
的列表,因为它已经实现了INotifyCollectionChanged,这有助于您通知UI某些内容已更改且需要更新。
这里有一些有用的链接: