XAML GridView,ObservableCollection和更改项的属性

时间:2014-06-21 15:41:49

标签: c# xaml gridview observablecollection

我有一个派生自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的代码,但我遇到的问题是所有内容都刷新而不只是一个已更新的项目。)

请问我有什么遗漏或误解?

感谢。

2 个答案:

答案 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中的说明使用转换器。