我有一个派生自BindableBase的类,它包含两个属性:
private string sourceCallNumber;
public string SourceCallNumber
{
get { return sourceCallNumber; }
set { SetProperty(ref sourceCallNumber, value); }
}
private string sourceMediaType;
public string SourceMediaType
{
get { return sourceMediaType; }
set { SetProperty(ref sourceMediaType, value); }
}
我有一个ObservableCollection,其中包含使用该类的许多项目。
我有一个GridView,我将ItemsSource设置为指向ObservableCollection。
我的问题是,如果我在其中一个项目上更改SourceMediaType的值,则显示不会更新。我已经调试了,并且可以确认更改值会导致OnPropertyChanged为该属性触发。
我已经阅读了很多关于类似问题的SO问题和答案,我对于我需要做些什么才能让它发挥作用感到非常困惑。
我的理解是,虽然ObservableCollection本身在更改属性时不执行任何操作,但如果项本身触发OnPropertyChanged,则应该让显示更新。
(我读过一个答案,建议使用名为TrulyObservableCollection的代码,但我遇到的问题是所有内容都刷新而不只是一个已更新的项目。)
请问我有什么遗漏或误解?
感谢。
答案 0 :(得分:0)
C#apps应该实现INotifyCollectionChanged和System.Collections.IList(而不是IList Of T)。
public class NameList : ObservableCollection<PersonName>
{
public NameList() : base()
{
Add(new PersonName("Willa", "Cather"));
Add(new PersonName("Isak", "Dinesen"));
Add(new PersonName("Victor", "Hugo"));
Add(new PersonName("Jules", "Verne"));
}
}
public class PersonName
{
private string firstName;
private string lastName;
public PersonName(string first, string last)
{
firstName = first;
lastName = last;
}
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
public string LastName
{
get { return lastName; }
set { lastName = value; }
}
}
请看GridView。
答案 1 :(得分:0)
@RodrigoSilva让我走上了正确的道路......引用这些值的XAML是这样的:
<StackPanel>
<TextBlock Text="{Binding DisplayCallNumber}" Style="{StaticResource TitleTextBlockStyle}" Visibility="{Binding GotCallNumber, Converter={StaticResource DisplayIfTrue}}" Margin="0,0,0,10"/>
<TextBlock Text="{Binding DisplayMediaType}" Style="{StaticResource ItemTextStyle}" Visibility="{Binding GotMediaType, Converter={StaticResource DisplayIfTrue}}" Margin="0,0,0,10"/>
</StackPanel>
它不直接引用底层属性SourceCallNumber和SourceMediaType。因此,虽然OnPropertyChanged正在为SourceCallNumber和SourceMediaType正确触发,但这不会导致显示更新,因为这不是XAML指向的内容。
将对SetProperty的调用显式更改为:
SetProperty(ref sourceCallNumber, value, "DisplayCallNumber");
修复了问题,但不是一个好的修复程序,因为应用程序的某些其他部分实际上可能绑定到SourceCallNumber,并且在此更改后不会获得属性更新。 GOOD修复是按照http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh464965.aspx中的说明使用转换器。