我正在努力工作MVVM。我创建了一个具有3个属性(ModelClass)的模型,在我的视图模型中,我有一个可观察的ModelClasses集合。在视图中,我将列表绑定到VM中的可观察集合。该列表是3个文本框的模板。
如何将文本框绑定到模型中的特定属性?
假设模型类名为Person并且具有名称,年龄和国家作为属性,视图模型具有人员集合,视图具有绑定到人员列表的列表(itemssource ..)。我不知道如何使列表中的文本框绑定到人员模型的名称,年龄和国家。
答案 0 :(得分:2)
根据您的查询,我构建了示例应用程序,它非常适合我。详细信息如下所示。
<强> PersonViewModel.cs 强>
internal class PersonViewModel{
public ObservableCollection<PersonModel> PersonCollection { get; set; }
public PersonViewModel()
{
//This data will load as the default person from the model attached to the view
PersonCollection = new ObservableCollection<PersonModel>();
PersonCollection.Add(new PersonModel { Name = "John", Age= 24, Country = "Canada"});
PersonCollection.Add(new PersonModel { Name = "David", Age = 25, Country = "United States"});
PersonCollection.Add(new PersonModel { Name = "Prajin", Age = 28, Country = "Japan"});
}
}
<强> PersonView.xaml 强>
<Window x:Class="MVVM.PersonView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MVVM Demostration" Height="297" Width="480"
xmlns:local="clr-namespace:MVVM.ViewModel">
<Window.DataContext>
<local:PersonViewModel />
</Window.DataContext>
<Grid Margin="10">
<ListBox ItemsSource="{Binding PersonCollection}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Path=Name}" Margin="5" Grid.Column="0" FontSize="14" />
<TextBlock Text="{Binding Path=Age}" Margin="5" Grid.Column="1" FontSize="14" />
<TextBlock Text="{Binding Path=Country}" Margin="5" Grid.Column="2" FontSize="14"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
<强> Person.cs 强>
internal class PersonModel : System.ComponentModel.INotifyPropertyChanged
{
private string name;
public string Name
{
get { return name; }
set
{
name = value;
OnPropertyChanged("Name");
}
}
private int age;
public int Age
{
get { return age; }
set
{
age = value;
OnPropertyChanged("Age");
}
}
private string country;
public string Country
{
get { return country; }
set
{
country = value;
OnPropertyChanged("Country");
}
}
#region INotifyPropertyChanged Members
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
#endregion
}
答案 1 :(得分:1)
您需要更改列表的ItemTemplate
以绑定属性:
<ListView ItemsSource="{Binding PersonsList}" >
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Name}" VerticalAlignment="Center" FontSize="14" />
<TextBlock Text="{Binding Path=Age}" VerticalAlignment="Center" FontSize="14" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
答案 2 :(得分:0)
创建一个ListBox并将对象集合绑定到其ItemsSource。在这里,Persons
是ViewModel的集合。
<ListBox ItemsSource="{Binding Persons}" />
然后为您的对象类型创建一个DataTemplate。
<DataTemplate DataType="{x:Type local:Person} >
<TextBox Text="{Binding Name}"/>
<TextBox Text="{Binding Age}"/>
etc...
</DataTemplate>
其中“local”是包含Person类型的命名空间的xml命名空间别名。
将此DataTemplate放入窗口的资源(Window.Resources
)。