簡體   English   中英

WPF通過轉換器將數據列綁定到數據網格中的圖像列,無法在屬性更改時更新圖像

[英]WPF binding an image column in a datagrid through a converter, can't update image on property change

我有綁定到可觀察項集合的此datagrid,如下所示:

<DataGrid ItemsSource="{Binding Path=MyItems}">

然后,通過將布爾值切換到圖像路徑的簡單轉換器,將其中一列綁定到MyItems的屬性。

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Image Name="DownloadedIcon" Source="{Binding Converter={StaticResource BoolToImageCheckmark}, ConverterParameter=IsDownloaded, UpdateSourceTrigger=PropertyChanged}" Width="16" Height="16" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

屬性本身IsDownloaded完全實現了INotifyPropertyChanged。

這正常工作,因為顯示的數據與集合的值匹配,並且image列根據屬性值正確顯示圖像。

屬性更改時會出現麻煩。 如果我直接在屬性上綁定文本列,則在更新屬性時內容也會更新。 但是,通過轉換器的image列將不會收到更新通知。

有任何想法嗎?

實際上,您沒有將圖像綁定到屬性IsDownloaded,而是將其綁定到列表中的整個對象。 路徑很重要。

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Image Name="DownloadedIcon" Source="{Binding Converter={StaticResource BoolToImageCheckmark}, ConverterParameter=IsDownloaded, Path=IsDownloaded, UpdateSourceTrigger=PropertyChanged}" Width="16" Height="16" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

嘗試這個:

<DataTemplate>
      <Image Name="DownloadedIcon" Source="{Binding Path=IsDownloaded,Converter={StaticResource BoolToImageCheckmark}}" Width="16" Height="16" />
</DataTemplate>

還要在轉換器中放置一個斷點,以驗證綁定是否確實有效。 請注意,您將通過轉換器中的Value參數獲得綁定值。

傳遞給ConverterParameter的值不會對PropertyChanged通知作出反應。 在綁定中使用Path而不是ConverterParameter,然后在轉換器的Convert()函數中引用value參數而不是parameter參數。

ConverterParameter不是依賴項屬性,因此無法像嘗試執行的操作那樣將其綁定到屬性。 您應該將圖像源綁定到IsDownloaded屬性並將其轉換為:

<DataTemplate>
  <Image Name="DownloadedIcon" Source="{Binding Path=IsDownloaded,Converter={StaticResource BoolToImageCheckmark}}" Width="16" Height="16" />
</DataTemplate>

問題出在您的轉換器類中。
由於綁定表達式未指定“ Path”,因此將當前DataContext用作路徑,並將DataContext對象作為您的轉換器類中的值。 正在對此datacontext對象的副本執行計算。
這種方法將在第一次執行綁定時成功。 結果,圖像列正確顯示了圖像。
后來的“ IsDownloaded”屬性發生了更改,它反映在ObservableCollectionClass中,但是圖像控件無法理解此更改,因為其源屬性未綁定到任何集合類屬性。 同樣,由於轉換器類收到了datacontext對象的副本,因此屬性更改也不會反映在轉換器類中。
因此,將圖像源屬性設置為集合類屬性“ IsDownloaded”。 對此屬性進行的任何更改都會觸發具有新值的轉換器類。

Image Name="DownloadedIcon" Source="{Binding Path=IsDownloaded,Converter={StaticResource BoolToImageCheckmark}}" Width="16" Height="16"/>

不需要UpdateSourceTrigger。

暫無
暫無

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

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