我有以下课程:
class MyViewModel
{
public List<MyItem> MyItems { get; set; }
public int Width { get; set; }
}
class MyItem
{
public string Name {get; set;}
}
如您所见,在同一个名为MyViewModel的类中有MyItems和Width属性列表。如何将该列表中的单个元素绑定到XAML中的Text属性,将ViewModel中的Width绑定到XAML的Width属性?这是我的尝试,但我不能同时绑定这两个属性。我的意思是,我可以将整个列表绑定到Text属性,但我不知道如何绑定单个项目。
<ListView ItemsSource="{Binding MyViewModel}">
<ListView.ItemTemplate>
<DataTemplate>
<Grid Height="15" Width="520">
<TextBlock Width="{Binding Width}" Text="{Binding=MyItems.Name(?)}" />
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
答案 0 :(得分:0)
你应该修改你的设计,但是这里有一个快速修复:只引入一个readonly属性,它返回第一个元素,所以你将拥有它(假设MyItems总是至少有元素,否则你会得到一个异常):
class MyViewModel
{
public List<MyItem> MyItems { get; set; }
public int Width { get; set; }
public MyItem FirstElement { get { return MyItems[0]; } }
}
在你的xaml中,你将TextBlock
绑定到这个属性:
<ListView ItemsSource="{Binding MyViewModel}">
<ListView.ItemTemplate>
<DataTemplate>
<Grid Height="15" Width="520">
<TextBlock Width="{Binding Width}" Text="{Binding=FirstElement}" />
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
有点offtopic,但仍然很重要:viewmodel类经常实现INotifyPropertyChanged
,因此视图将能够自动更新。出于同样的原因,List<T>
应替换为ObservableCollection<T>
。