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

时间:2014-11-15 18:57:46

标签: 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; }
}

一个非常简单的ViewModel

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")
            };
    }
}

和一个非常简单的视图

<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,则列表视图会更新。

如果Person没有实现INotifyPropertyChanged

,那怎么可能呢?

由于

P.S。 ViewModelScreen

继承Caliburn.Micro

2 个答案:

答案 0 :(得分:3)

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

我不会依赖这种绑定。

  • 它比实施INPC更慢更重(最好 实践POCO对象的建议。)
  • 它仅适用于更改 通过Binding语法启动。如果你是以编程方式 更改Name的值,列表不会响应。

答案 1 :(得分:0)

我不确定,但我认为........

  1. 您的Persons属性实现了INotifyPropertyChanged接口,因此,Person类中的所有对象或属性也实现了INotifyPropertyChanged。

  2. 在这种情况下我可能错了。 ObservableCollection还在内部实现了INotifyPropertyChanged。因此,不需要在Persons Property中实现INotifyPropertyChanged。