簡體   English   中英

更改項目屬性時如何進行ObservableCollection更新

[英]How to make an ObservableCollection update when an item property is changed

我已經看過這個問題很多次了(並回答了),但我似乎仍然無法弄清楚我所缺少的是什么...

我有一個帶有復選框列表的窗口,我希望能夠從后台隱藏代碼動態地啟用/禁用列表中的復選框。 為此,我有幾個單選按鈕,它們調用一個代碼隱藏函數來切換VisibleFeatures集合中第一個條目的“ Enabled”屬性。 理想情況下,這將導致第一個復選框+文本啟用/禁用,但不會發生UI更改。

我究竟做錯了什么?

ViewModel:

public class MyFeature
{
   private bool _supported;
   private bool _enabled;
   private bool _selected;
   public string Name { get; set; }

   public bool Supported
   {
      get { return _supported; }
      set { _supported = value; NotifyPropertyChanged("Supported"); }
   }
   public bool Enabled
   {
      get { return _enabled; }
      set { _visible = value; NotifyPropertyChanged("Enabled"); }
   }
   public bool Selected
   {
      get { return _selected; }
      set { _selected = value; NotifyPropertyChanged("Selected"); }
   }

   public MyFeature(string name)
   {
      Name = name;
      _supported = false;
      _enabled = false;
      _selected = false;
   }

   public event PropertyChangedEventHandler PropertyChanged;
   private void NotifyPropertyChanged(string propertyName)
   {
      if (PropertyChanged != null)
      {
         PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
      }
   }
}

public ObservableCollection<MyFeature> VisibleFeatures { get; set; }

void VisibleFeatures_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
   if (e.NewItems != null)
      foreach (MyFeature item in e.NewItems)
         item.PropertyChanged += MyFeature_PropertyChanged;

   if (e.OldItems != null)
      foreach (MyFeature item in e.OldItems)
         item.PropertyChanged -= MyFeature_PropertyChanged;
}

void MyFeature_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
   // NotifyPropertyChanged() defined again elsewhere in the class
   NotifyPropertyChanged("VisibleFeatures");
}

public Init()
{
   VisibleFeatures = new ObservableCollection<MyFeature>();
   VisibleFeatures.CollectionChanged += VisibleFeatures_CollectionChanged;
   VisibleFeatures.Add(new MyFeature("Feature1"));
   VisibleFeatures.Add(new MyFeature("Feature2"));
   ...
}

XAML:

<StackPanel>
   <ListView ItemsSource="{Binding VisibleFeatures}">
      <ListBox.ItemTemplate>
         <DataTemplate>
            <StackPanel IsEnabled="{Binding Enabled, Mode=TwoWay}">
               <CheckBox IsChecked="{Binding Selected, Mode=TwoWay}">
                  <TextBlock Text="{Binding Name}" />
               </CheckBox>
            </StackPanel>
         </DataTemplate>
      </ListBox.ItemTemplate>
   </ListView>
</StackPanel>

您的類MyFeature需要聲明它實現了INotifyPropertyChanged接口。 否則,XAML將不會生成任何偵聽器來偵聽您的屬性更改通知。

此外,從您的示例中,我看不到通知VisibleFeatures更改。

從INotifyPropertyChanged接口派生您的類“ MyFeature”。

為了反映視圖中可觀察集合中所做的運行時更改,必須從INotifyPropertyChanged接口派生viewmodel類(此處為MyFeature類)。

另外,建議在任何使用綁定屬性的地方都使用相同的實例,而不要創建新的實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM