gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:47:59 24 4
gpt4 key购买 nike

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

我有一个基本的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com