我正在构建一个WPF应用程序,它只是一个供团队成员编辑xml的UI。在遇到这个问题之前,我的视图模型设置工作得很好。
假设我有一个模型“ Animal”,其中继承了“ Dog”和“ Bird”。
在我的视图模型中,我有财产
public ObservableCollection<AnimalViewModel> Animals {get; set;}
在我看来,我会在列表视图中显示每只动物,但是对于鸟类,我希望有一个“ CanFly”(企鹅和其他)复选框。我该如何设置我的视图模型并进行绑定?
下面是我当前设置的一个示例。
//MODELS
public class Animal
{
public string Name;
}
public class Dog:Animal
{
public string Breed;
}
public class Bird:Animal
{
public bool CanFly;
}
//VIEWMODELS
//PropertyChanged.Fody nuget package
[AddINotifyPropertyChangedInterface]
public class BaseViewModel: INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged = (sender, e) => { };
}
public class AnimalDataVM:BaseViewModel
{
public ObservableCollection<AnimalVM> Animals{get;set;}
}
public class AnimalVM
{
private Animal animal;
public AnimalVM(Animal _animal)
{
animal = _animal;
}
public string Name
{
get
{
return animal.Name;
}
set
{
animal.Name = value;
}
}
}
public class BirdVM
{
private Bird bird;
public BirdVM(Bird _bird)
{
bird = _bird;
}
public string Name
{
get
{
return bird.Name;
}
set
{
bird.Name = value;
}
}
public bool CanFly
{
get
{
return bird.CanFly;
}
set
{
bird.CanFly = value;
}
}
}
答案 0 :(得分:2)
第一种选择是使用DataTemplate
。但这要求您在ViewModel
中拥有不同的类。然而,它非常高效且易于实现:
<ListView Name="MyListview">
<ListView.Resources>
<DataTemplate DataType="{x:Type local:AnimalViewModel}">
<TextBlock Text="Animal"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:DogViewModel}">
<TextBlock Text="Dog"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:BirdViewModel}">
<StackPanel Orientation="Horizontal">
<CheckBox Content="Can fly"/>
<TextBlock Text="Bird"/>
</StackPanel>
</DataTemplate>
</ListView.Resources>
</ListView>
如果您的ViewModel
中不能有其他类型,则应使用Style
DataTrigger
和班级属性:
<ListView Name="MyListview">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox Content="Can fly">
<CheckBox.Style>
<Style TargetType="CheckBox">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsBird}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>
<TextBlock Text="Anything"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>