WPF связывает столбец изображения в сетке данных через конвертер, не может обновить изображение при изменении свойства - PullRequest
1 голос
/ 05 ноября 2011

У меня есть эта таблица данных, которая связана с наблюдаемой коллекцией элементов, например:

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

Затем один из столбцов привязывается к свойству MyItems через простой конвертер, который переключает bool в путь к изображению.

<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.

Это работает нормально, поскольку отображаемые данные соответствуют значениям коллекции, а столбец изображения правильно отображает изображение на основе значения свойства.

Проблема возникает при изменении свойства. Если я привяжу текстовый столбец непосредственно к свойству, содержимое будет обновляться при обновлении свойства. Однако столбец изображения, который проходит через конвертер, не получит уведомление об обновлении.

Есть идеи?

Ответы [ 5 ]

0 голосов
/ 12 сентября 2012

фактически, вы не привязали изображение к свойству 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>
0 голосов
/ 05 ноября 2011

Проблема в вашем классе конвертеров.Поскольку в выражении привязки не указан «путь», текущий DataContext используется в качестве пути и приводит к объекту DataContext в качестве значения в вашем классе преобразователя.Расчеты выполняются на этой копии объекта datacontext.Этот подход будет успешным в первый раз при выполнении привязки.В результате столбец изображения правильно отображает изображение.Позже свойство IsDownloaded изменяется, оно отражается в ObservableCollectionClass, но элемент управления изображения не может понять это изменение, поскольку его свойство источника не привязано ни к какому свойству класса коллекции.Подобно тому, как класс преобразователя получил копию объекта datacontext, изменения свойств также никогда не отражаются в классе преобразователя.Поэтому установите свойство источника изображения равным свойству класса коллекции IsDownloaded.Любые изменения, произошедшие с этим свойством, приведут к тому, что класс преобразователя получит новое значение.


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

UpdateSourceTrigger не требуется.

0 голосов
/ 05 ноября 2011

значения, передаваемые в ConverterParameter, не реагируют на уведомления PropertyChanged.Используйте Path вместо ConverterParameter в привязке, а затем обратитесь к аргументу значения в функции Convert () в конвертере вместо аргумента параметра.

0 голосов
/ 05 ноября 2011

ConverterParameter не является свойством зависимости, и поэтому вы не можете привязать его к свойству, как вы пытались это сделать.Вам следует привязать источник изображения к свойству IsDownloaded и преобразовать его:

<DataTemplate>
  <Image Name="DownloadedIcon" Source="{Binding Path=IsDownloaded,Converter={StaticResource BoolToImageCheckmark}}" Width="16" Height="16" />
</DataTemplate>
0 голосов
/ 05 ноября 2011

Попробуйте это:

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

Также установите точку останова в конвертере, чтобы убедиться, что привязка действительно работает. Обратите внимание, что вы получите связанное значение через параметр Value в вашем конвертере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...