c# - 未实现 INPC 的对象如何通知更改?

标签 c# .net mvvm observablecollection inotifypropertychanged

给知道答案的人的简单问题:

我有一个基本的 Person 类,定义如下:

public class Person
{
   public Person(string name, string surname)
   {
        this.Name = name;
        this.Surname = surname;
   }

   public string Name { get; set; }

   public string Surname { get; set; }
}

一个非常简单的 View 模型

public partial class SimpleViewModel : Screen
{
    public SimpleViewModel()
    {
        this.Persons = new ObservableCollection<Person>(this.GetPersons());
    }

    private ObservableCollection<Person> persons;
    public ObservableCollection<Person> Persons
    {
        get { return this.persons; }
        set
        {
            if (this.persons == value) return;

            this.persons = value;
            this.NotifyOfPropertyChange(() => this.Persons);
        }
    }


    private Person selectedPerson;
    public Person SelectedPerson
    {
        get { return this.selectedPerson; }
        set
        {
            if (this.selectedPerson == value) return;

            this.selectedPerson = value;
            this.NotifyOfPropertyChange(() => this.SelectedPerson);
        }
    }

    IEnumerable<Person> GetPersons()
    {
        return
            new Person[]
            {
                new Person("Casey", "Stoner"),
                new Person("Giacomo", "Agostini"),
                new Person("Troy", "Bayliss"),
                new Person("Valentino", "Rossi"),
                new Person("Mick", "Doohan"),
                new Person("Kevin", "Schwantz")
            };
    }
}

和一个非常简单的 View

<Window x:Class="Test.SimpleView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="SimpleView"
        Width="300"
        Height="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="8"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>

        <ListView x:Name="lsv"
                  ItemsSource="{Binding Persons}"
                  SelectedItem="{Binding SelectedPerson}" Grid.RowSpan="3">
            <ListView.View>
                <GridView>
                    <GridViewColumn DisplayMemberBinding="{Binding FirstName}" />
                    <GridViewColumn DisplayMemberBinding="{Binding LastName}" />
                </GridView>
            </ListView.View>
        </ListView>

        <StackPanel Grid.Row="2"
                    Grid.Column="1"
                    VerticalAlignment="Center">
            <TextBox Text="{Binding SelectedPerson.FirstName, UpdateSourceTrigger=PropertyChanged}" />
            <TextBox Text="{Binding SelectedPerson.LastName, UpdateSourceTrigger=PropertyChanged}" />
        </StackPanel>

    </Grid>
</Window>

如果我在文本框中编辑 FirstNameLastName, ListView 会更新。

如果 Person 没有实现 INotifyPropertyChanged,这怎么可能?

谢谢

附言ViewModel 继承Screen来自 Caliburn.Micro

最佳答案

这是使用 PropertyDescriptor 传播更改通知 as described here .

我不会依赖这种绑定(bind)。

  • 它比实现 INPC 更慢且重量更重(最好 对 POCO 对象的实践建议)。
  • 它只适用于变化 通过绑定(bind)语法启动。如果您要以编程方式 更改 Name 的值,列表将不会响应。

关于c# - 未实现 INPC 的对象如何通知更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26949509/

相关文章:

c# - 使用自定义条件和分隔符拆分字符串

.net - LINQ Concat 两个列表制作一个 csv 列表

c# - 带参数的 LinkBut​​ton.OnClick 方法

wpf - 如何使用MVVM启动动画?

c# - .NET Core 是否支持 COM?

C# 泛型类型约束

c# - 如何从未由 MEF 容器实例化的对象中导出部件

.net - Oracle ODP.NET连接字符串:数据源中包含什么?

wpf - 使用Caliburn将面包屑导航添加到WPF MVVM应用

c# - ViewModel 与 Model 有不同的字段吗?