【问题标题】:Wpf binding when property of the viewmodel is changed更改视图模型的属性时的 Wpf 绑定
【发布时间】:2014-07-10 11:11:47
【问题描述】:

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

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

ItemsSource="{Binding TheIListOfObjects}"

ItemsControl 中的项目实际上显示的是 List 中的信息。

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

【问题讨论】:

  • 看起来这可以使用INotifyCollectionChanged 自动完成,您的列表来源应该是ICollectionViewObservableCollection
  • 你需要的是,你有一个 SomeClass 的列表。然后,当按下按钮时,List 中的信息会发生变化,并且可以在视图中看到它。

标签: wpf mvvm binding


【解决方案1】:

您需要的只是属性类型的 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; }
}

【讨论】:

  • 你的 Button_Click 方法破坏了 MVVM 模式
【解决方案2】:

为确保将集合中的更改通知给其绑定控件,您必须使用ObservableCollection&lt;&gt; 而不是IList&lt;&gt;

【讨论】:

    【解决方案3】:

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

    ItemsSource="{Binding TheIListOfObjects}"
    

    ...您应该操作TheIListOfObjects 集合:

    TheIListOfObjects = GetNewCollectionItems();
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 2020-07-01
      • 1970-01-01
      相关资源
      最近更新 更多