IValueConverter не обновляет источник изображения - PullRequest
0 голосов
/ 30 мая 2018

У меня есть эта ObservableCollection в моей ViewModel:

 private ObservableCollection<Component> _standardComponents;
 public ObservableCollection<Component> StandardComponents
        {
            get { return _standardComponents; }
            set { SetProperty(ref _standardComponents, value); }
        }

Одно из его свойств

public bool ExistInDatabase { get; set; } 

изменяется в зависимости от действий пользователя.

Я отображаю это свойствов моем ListView, используя IValueConverter, как это:

[ValueConversion(typeof(bool), typeof(BitmapImage))]
    public class BoolToBitmapImageConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var bitmapImage = ((bool)value == true) ? "Images/Green Ball.png" : "Images/Red Ball.png";
            return new BitmapImage(new Uri($"/Proxos.Core;Component/{bitmapImage}", UriKind.Relative));
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return null;
        }
    }

И в моем View я использую этот шаблон в качестве динамического ресурса:

 <GridViewColumn.CellTemplate>
     <DataTemplate>
         <Image Source="{Binding ExistInDatabase, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource BoolToBitmapImageConverter}}" Height="17" Width="17"/>
     </DataTemplate>
 </GridViewColumn.CellTemplate>

Чтобы отобразить преобразованное свойство ExistInDatabase в моем ListView:

<ListView Grid.ColumnSpan="7" Grid.RowSpan="10"  x:Name="_componentListView" Margin="10" ItemsSource="{Binding StandardComponents, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" View="{DynamicResource componentsList}" SelectedIndex="{Binding ComponentSelectedIndex}" >

Работает нормально, когда я впервые загружаю UserControll, но когда я обновляю свойство ExistInDatabase, IValueConverter не запускается.

Это мой ListView: ListView

1 Ответ

0 голосов
/ 30 мая 2018

Вам все еще нужно вызвать OnPropertyChanged (nameof (ExistInDatabase)), когда вы меняете его, я полагаю.Эта структура не будет волшебным образом сделать это для вас.- Biesi Grr

Благодаря вашему совету Biesi!Мне удалось решить проблему.

Я изменил свойство модели ExistInDatabase:

public bool ExistInDatabase
        {
            get { return _exitsInDatabase; }
            set
            {
                _exitsInDatabase = value;
                OnPropertyChanged();
            }
        }

И добавил PropertyChangedEventHandler:

public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

Теперь, когда пользователь изменяетListView PropertyChangedEvent запускается, и пользовательский интерфейс обновляется.

ListView

...