让我们考虑以下三个类:
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
选择更改绑定。你对如何应对这种情况有什么建议吗?
假设:
- 我们处于MVVM模式
- 我们不希望每种类型都有一个
DataGrid
(总共3个DataGrid
) - 我们不允许修改模型
如果你不想要多个数据网格,我会选择一个包含所有对象类型的所有列的数据网格。在运行时,您将隐藏与当前类型无关的列。BTW这与拥有多个数据网格并隐藏与当前类型无关的数据网格没有什么不同。
您可以为每个类创建一个DataTemplate
,然后在运行时使用类似的DataTemplateSelector
来更改模板
如果您想将数据动态绑定到DataGrid,我们可以使用类型dynamic。
按照创建属性
public ObservableCollection<dynamic> SampleListData
{
get { return _sampleListData; }
set { _sampleListData = value; NotifyPropertyChanged("SampleListData"); }
}
-在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" });
}
}
}
我希望这对你有帮助。