WPF:在ViewModel

时间:2015-05-12 06:30:39

标签: c# wpf mvvm binding datagrid

让我们考虑以下三个类:

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,其项目为animalscarstrees。根据用户的选择,这些集合中的每一个都将显示在DataGrid中。但是,由于数据类型不同,因此无法预先定义列的正确绑定,并且必须针对ComboBox选择更改绑定。您对如何解决这种情况有任何建议吗?

假设:

  • 我们是MVVM模式。
  • 我们不希望每种类型都有一个DataGrid(总计最多3 DataGrid个。)
  • 我们不允许修改模型。

3 个答案:

答案 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" });
            }
        }
    }

我希望这会对你有所帮助。