2017-03-09 74 views
1

我不明白PropertyChanged事件如何在綁定上下文中工作。 請考慮這個簡單的代碼:PropertyChanged in binding

public class ImageClass 
{ 
    public Uri ImageUri { get; private set; } 
    public int ImageHeight { get; set; } 
    public int ImageWidth { get; set; } 
    public ImageClass(string location) 
    { 
     // 
    }   
} 

public ObservableCollection<ImageClass> Images 
{ 
    get { return (ObservableCollection<ImageClass>)GetValue(ImagesProperty); } 
    set { SetValue(ImagesProperty, value); } 
} 

public static readonly DependencyProperty ImagesProperty = DependencyProperty.Register("Images", typeof(ObservableCollection<ImageClass>), typeof(ControlThumbnail), new PropertyMetadata(null)); 

在運行時我更改了Images收集的一些元素:

Images[i].ImageWidth = 100; 

它沒有效果 - 據我理解,因爲PropertyChanged事件沒有定義,然後不被解僱。

我很困惑如何聲明這樣的事件,我需要把事件處理函數放在裏面。

我試着這樣做:

foreach (object item in Images) 
{ 
    if (item is INotifyPropertyChanged) 
    { 
     INotifyPropertyChanged observable = (INotifyPropertyChanged)item; 
     observable.PropertyChanged += new PropertyChangedEventHandler(ItemPropertyChanged); 
    } 
} 

private void ItemPropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
} 
+0

它你有設置對象的值(後後觸發一個事件設置者Setvalue),並在你的視圖中設置{Binding YourObject,UpdateSourceTrigger = PropertyChanged} ...這樣視圖就會知道屬性改變了它的值,並會要求獲取者獲取新值:) –

+1

@BernardWalters請注意t帽子'UpdateSourceTrigger = PropertyChanged'與實現INotifyPropertyChanged並觸發PropertyChanged事件的綁定源無關。實際上,UpdateSourceTrigger控制着一個TwoWay或OneWayToSource綁定如何在目標對象發生變化時觸發源對象的更新,這在OneWay綁定中是不會發生的。 – Clemens

回答

3

ImageClass落實INotifyPropertyChanged界面是這樣的:

public class ImageClass : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private int imageWidth; 
    public int ImageWidth 
    { 
     get { return imageWidth; } 
     set 
     { 
      imageWidth = value; 
      PropertyChanged?.Invoke(this, 
       new PropertyChangedEventArgs(nameof(ImageWidth))); 
     } 
    } 

    ... 
} 
+0

你能解釋一下Invoke語句的語法嗎?我以前沒見過這種味道。 –

+1

這就是[null-conditional operator](https://msdn.microsoft.com/en-us/library/dn986595.aspx)。它可以節省您對事件的空檢查。 – Clemens

+0

明白了,謝謝!我能夠擴展到所有其他屬性。只是澄清:根據伯納德的評論,當我需要在視圖中設置「{Binding YourObject,UpdateSourceTrigger = PropertyChanged}」時? – Mark