C# 将viewmodel中的ObservableCollection绑定到listbox
我对MVVM和绑定非常陌生,我正在尝试学习如何使用它。 我遇到了将视图模型绑定到视图的问题,特别是将可观察集合绑定到列表框的问题 这就是我的viewmodel的外观:C# 将viewmodel中的ObservableCollection绑定到listbox,c#,wpf,mvvm,binding,viewmodel,C#,Wpf,Mvvm,Binding,Viewmodel,我对MVVM和绑定非常陌生,我正在尝试学习如何使用它。 我遇到了将视图模型绑定到视图的问题,特别是将可观察集合绑定到列表框的问题 这就是我的viewmodel的外观: namespace MyProject { using Model; public class NetworkViewModel: INotifyPropertyChanged { private ObservableCollection<Person> _networkList1 = new O
namespace MyProject
{
using Model;
public class NetworkViewModel: INotifyPropertyChanged
{
private ObservableCollection<Person> _networkList1 = new ObservableCollection<Person>();
public ObservableCollection<Person> NetworkList1 //Binds with the listbox
{
get { return _networkList1; }
set { _networkList1 = value; RaisePropertyChanged("_networkList1"); }
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
var handler = this.PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public NetworkViewModel()
{
_networkList1 = new ObservableCollection<Person>()
{
new Person(){FirstName="John", LastName="Doe"},
new Person(){FirstName="Andy" , LastName="Boo"}
};
}
}
在我的XAML中
<ListBox x:Name="lb1" HorizontalAlignment="Left" ItemsSource="{Binding NetworkList1}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock >
<Run Text="{Binding Path=FirstName}"/>
<Run Text="{Binding Path=LastName}"/>
</TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
您的视图模型似乎有输入错误
RaisePropertyChanged("_networkList1");
您希望为公共属性而不是私有变量发出属性更改通知
RaisePropertyChanged("NetworkList1");
这可能会妨碍视图的正确更新。您的视图模型似乎有输入错误
RaisePropertyChanged("_networkList1");
您希望为公共属性而不是私有变量发出属性更改通知
RaisePropertyChanged("NetworkList1");
这可能会阻止您的视图正确更新。除了Gaurav answer,如果
\u networkList1
是您的NetworkViewModel
类中的私有字段,如何在Networking
窗口中访问它?我是说下面这句话是什么意思
lb1.ItemsSource = _networkList1;
定义属性时(NetworkList1
),必须使用该属性,以利用其功能(例如,使RaiseProperty更改
工作)。否则,您可以定义一个字段(\u networklist1
)。如此变化
_networkList1 = new ObservableCollection<Person>()
到
应该让你的装订工作
*请注意,当您将DataContext
设置为NetworkViewModel
时,绑定
<ListBox x:Name="lb1" HorizontalAlignment="Left" ItemsSource="{Binding NetworkList1}">
有效,因为除了Gaurav answer之外,
NetworkList1
是NetworkViewModel
的属性,如果\u NetworkList1
是NetworkViewModel
类中的私有字段,如何在Networking
窗口中访问它?我是说下面这句话是什么意思
lb1.ItemsSource = _networkList1;
定义属性时(NetworkList1
),必须使用该属性,以利用其功能(例如,使RaiseProperty更改
工作)。否则,您可以定义一个字段(\u networklist1
)。如此变化
_networkList1 = new ObservableCollection<Person>()
到
应该让你的装订工作
*请注意,当您将DataContext
设置为NetworkViewModel
时,绑定
<ListBox x:Name="lb1" HorizontalAlignment="Left" ItemsSource="{Binding NetworkList1}">
因为
NetworkList1
是NetworkViewModel
的一个属性,看在上帝的份上,不要调用observeCollection
上的RaisePropertyChanged()
方法。在大多数情况下,这是一个常见的错误(但是,在有些情况下,您需要使用new
关键字重置observateCollection
,但这种情况很少发生)。
这是一种特殊类型的集合,它在UI内部通知其内容的所有更改(如添加、删除等)。您需要的是在ViewModel的生命周期中使用new
关键字设置集合一次,然后通过Add(T item)
、Remove(T item)
、Clear()
方法等操作项目。
用户界面将收到通知并自动更新。看在上帝的份上,不要调用
ObservableCollection
上的RaisePropertyChanged()
方法。在大多数情况下,这是一个常见的错误(但是,在有些情况下,您需要使用new
关键字重置observateCollection
,但这种情况很少发生)。
这是一种特殊类型的集合,它在UI内部通知其内容的所有更改(如添加、删除等)。您需要的是在ViewModel的生命周期中使用new
关键字设置集合一次,然后通过Add(T item)
、Remove(T item)
、Clear()
方法等操作项目。
UI将收到通知并自动更新。如果您是MVVM新手,我强烈建议您考虑使用MVVM框架。一个例子(我使用的)是Caliburn.Micro()。MVVM框架使事情变得非常简单,例如只需将视图中控件的
x:Name
设置为与属性名称匹配,即可自动绑定到视图模型上的公共属性。如果您是MVVM新手,我强烈建议您考虑使用MVVM框架。一个例子(我使用的)是Caliburn.Micro()。MVVM框架使事情变得非常简单,例如只需将视图中控件的x:Name
设置为与属性名称匹配,即可自动绑定到视图模型上的公共属性。感谢您关注我的问题,我尝试了您的建议,但不幸的是,我仍然没有在列表框中获得任何数据。我只是注意到您还在代码和XAML中设置ItemSource属性。在MVVM中,除了DataContext之外,您不必从代码中设置任何其他属性。有些框架甚至在XAML中这样做。感谢您关注我的问题,我尝试了您的建议,但不幸的是,我仍然没有在列表框中获得任何数据。我只是注意到您还在代码和XAML中设置ItemSource属性。在MVVM中,除了DataContext之外,您不必从代码中设置任何其他属性。有些框架甚至在XAML中实现了这一点