簡體   English   中英

為什么對單個綁定項進行更改不會刷新ObservableCollection中的該項?

[英]Why does raising changes on an individual bound item not refresh that item in an ObservableCollection?

我覺得有必要為這個問題道歉。 我確定答案已經在這里某處存在,但是我在理解這里發生的事情時遇到了麻煩。 我可以使用一些幫助學習。

我的問題是使WPF對ObservableCollections對象的更改做出反應的經常提出的問題。 我的ViewModel上有一個稱為ItemPrices的屬性公開。 ViewModel實現INotifyPropertyChanged 該集合是一個名為Price的EF對象,但沒有。

該集合綁定到ListView 集合中的每個項目都有一個按鈕-單擊此按鈕可以更改綁定到該行的Price對象的狀態。 這一切都很好。 我想發生的是當用戶單擊按鈕時按鈕上的圖像發生更改。

我通過創建一個Converter來解決這個問題,該Converter根據綁定的Price對象的屬性返回一個不同的源字符串。 這也適用-但僅當您關閉窗口並重新打開它時。 我希望它在用戶單擊按鈕時立即做出反應。

我知道ObservableCollection僅響應添加和刪除,並且我需要做其他事情來通知ViewModel集合內的對象已更改。 我沒有在ListView上使用SelectedItem進行任何其他操作,所以我認為我會使用它。

因此,我在ViewModel中添加了SelectedPrice屬性,並將其綁定到ListView中的SelectedItem屬性。 然后,在用戶單擊按鈕時執行的函數中,我添加了SelectedPrice = price price-假定對OnPropertyChanged的調用將冒泡並導致該項目在ViewModel中刷新。

它沒有用,我也不完全知道為什么。 我已經嘗試了其他各種方法,例如將ObservableCollection包裹在ICollectionView並在其上調用Refresh() ,並將INotifyPropertyChanged添加到Price中-但是我什么也做不了,無法立即刷新該圖像。

編輯:我沒有張貼代碼,因為所有相關的代碼將不堪重負。 但有人要求:

<Button Width="30" HorizontalAlignment="Right" Margin="5" CommandParameter="{Binding}"
    Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.DocumentCommand}" >
        <Image HorizontalAlignment="Center" VerticalAlignment="Center" Source="{Binding Converter={StaticResource PriceDocumentImageConverter} }" />
</Button>

和轉換器:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    Price price = (Price)value;
    if(price.DocumentId != null)
    {
        return @"/Resources/Icons/Document-View.png";
    }
    return @"/Resources/Icons/Document-Add.png";
}

EDIT2-INotifyPropertyChanged在價格上,如下所示:

public partial class Price : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

您必須在Price對象上實現INotifyPropertyChanged PropetyChanged事件不會冒泡,它只會知道自己的對象。

假設按鈕是DataTemplate的一部分,則基本上已經將圖像的源綁定到“ this”(綁定到Price對象本身),實際上您似乎想將其綁定到狀態(可能是屬性)上。單擊按鈕時更改。 該屬性是應觸發PropertyChanged事件的屬性(將其名稱作為屬性名稱傳遞),並且圖像源應綁定到該屬性,即(假設其稱為State):

public partial class Price : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public int State
    {
        get { /*...*/ }
        set
        {
             /*...*/
             OnPropertyChanged("State");
        }
    }
}

XAML:

<Image Source="{Binding State, Converter={StaticResource PriceDocumentImageConverter} }" />

當然,您必須更新轉換器,因為它現在將獲得傳入的State屬性的值。

暫無
暫無

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

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