让我们考虑以下三个类:
public class Animal
{
public string name { set; get; }
public string genome { set; get; }
}
public class Car
{
public string name { set; get; }
public int model { set; get; }
public int horsePower { set; get; }
}
public class Tree
{
public string name { set; get; }
public int age { set; get; }
}
每种类型的集合如下:
ObservableCollection<Animal> animals { set; get; }
ObservableCollection<Car> cars { set; get; }
ObservableCollection<Tree> trees { set; get; }
我们有一个ComboBox
,其项目为animals
,cars
和trees
。根据用户的选择,这些集合中的每一个都将显示在DataGrid
中。但是,由于数据类型不同,因此无法预先定义列的正确绑定,并且必须针对ComboBox
选择更改绑定。您对如何解决这种情况有任何建议吗?
假设:
DataGrid
(总计最多3 DataGrid
个。)答案 0 :(得分:1)
如果您不想要多个数据网格,我会使用单个数据网格,其中包含所有对象类型的所有列。在运行时,您将隐藏与当前类型无关的列。 BTW与拥有多个数据网格没有任何区别,并隐藏那些与当前类型无关的数据网格。
答案 1 :(得分:0)
您可以为每个类创建DataTemplate
,然后在运行时使用DataTemplateSelector
<{1}}更改模板,例如this
答案 2 :(得分:0)
如果要将数据动态绑定到DataGrid,我们可以使用动态类型。
按如下方式创建属性
public ObservableCollection<dynamic> SampleListData
{
get { return _sampleListData; }
set { _sampleListData = value; NotifyPropertyChanged("SampleListData"); }
}
-in XAML将组合框选择的值绑定到属性
<ComboBox x:Name="cbStatus" SelectedValuePath="Content" SelectedValue="{Binding selectedStatus, Mode=TwoWay}" HorizontalAlignment="Left" Height="25" Margin="67,5,0,0" VerticalAlignment="Top" Width="160" Grid.Row="1">
<ComboBoxItem x:Name="opAnimal" Content="Animal"/>
<ComboBoxItem x:Name="opCar" Content="Car"/>
<ComboBoxItem x:Name="opTree" Content="Tree"/>
</ComboBox>
- 在更改组合框值时,您可以根据所选值绑定itemsource。
public string selectedStatus
{
get { return _selectedStatus; }
set
{
_selectedStatus = value; NotifyPropertyChanged("selectedStatus");
if (selectedStatus == "Tree")
{
SampleListData = new ObservableCollection<dynamic>();
SampleListData.Add(new Tree { name = "Mohan", age = 25 });
SampleListData.Add(new Tree { name = "Tangella", age = 28 });
}
if (selectedStatus == "Car")
{
SampleListData = new ObservableCollection<dynamic>();
SampleListData.Add(new Car { name = "Mohan", horsePower=68,model = 1 });
SampleListData.Add(new Car { name = "Mohan", horsePower = 72, model = 1 });
}
if (selectedStatus == "Animal")
{
SampleListData = new ObservableCollection<dynamic>();
SampleListData.Add(new Animal { name = "Tiger", genome="H" });
SampleListData.Add(new Animal { name = "Lion", genome="FG" });
}
}
}
我希望这会对你有所帮助。