更改viewmodel的属性时的Wpf绑定

时间:2014-07-10 11:11:47

标签: wpf mvvm binding

我的wpf项目遵循MVVM模式。在我的视图模型中,我有一个IList的obejcts,我从数据库中获取。此IList中的每个对象都有一个List属性。

当我打开该视图模型的视图时,我有一个带有此属性的ItemsControl:

ItemsSource="{Binding TheIListOfObjects}"

并且ItemsControl中的项目实际上显示了List中的信息。

因此,当用户在视图上时,会显示一个itemscontrol。我想要做的是:在同一视图中,如果用户单击按钮,则更改列表。如何让ItemsControl刷新并显示新信息?

3 个答案:

答案 0 :(得分:0)

您需要拥有的是属性类型的ObservableCollection类型。

的Xaml

<Window x:Class="Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <StackPanel>
        <Button Content="Click" Click="Button_Click" />
        <ListView ItemsSource="{Binding People}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
                </GridView>
            </ListView.View>
        </ListView>
    </StackPanel>
</Window>

Xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private ObservableCollection<Person> _people = new ObservableCollection<Person>();
    public ObservableCollection<Person> People
    {
        get { return _people; }
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        People.Add(new Person { Name = "A" });
    }
}

public class Person
{
    public string Name { get; set; }
}

答案 1 :(得分:0)

要确保将集合中的更改通知其绑定控件,您必须使用ObservableCollection<>而不是IList<>

答案 2 :(得分:0)

在WPF中,一旦我们将数据绑定到集合控件的ItemsSource属性,我们就刷新ItemsSource属性,或者进行交互以任何其他方式与它。相反,我们使用数据绑定属性值,因此对于您的示例...:

ItemsSource="{Binding TheIListOfObjects}"

...你应该操纵TheIListOfObjects集合:

TheIListOfObjects = GetNewCollectionItems();

如果您在视图模型中正确实现了INotifyPropertyChanged界面,那么您的视图应该按预期更新。