C# 将viewmodel中的ObservableCollection绑定到listbox

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

我对MVVM和绑定非常陌生,我正在尝试学习如何使用它。 我遇到了将视图模型绑定到视图的问题,特别是将可观察集合绑定到列表框的问题

这就是我的viewmodel的外观:

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中实现了这一点