【问题标题】:IValueConverter not updating the image sourceIValueConverter 不更新图像源
【发布时间】:2018-11-08 21:24:30
【问题描述】:

我的 ViewModel 中有这个 ObservableCollection:

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

它的属性之一

public bool ExistInDatabase { get; set; } 

根据用户操作而变化。

我使用 IValueConverter 在我的 ListView 中显示此属性,如下所示:

[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;
        }
    }

在我看来,我将此模板用作动态资源:

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

在我的 ListView 中显示转换后的 ExistInDatabase 属性:

<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

【问题讨论】:

  • 您是否为您的 ViewModel 实现 INotifyPropertyChanged 并在 ExistInDatabase 更改时调用事件?
  • 我正在使用 Prism,所以我的 ViewModel 派生自 ViewModelBase,而我的 ViewModelBase 派生自 BindableBase,后者实现了 INotifyPropertyChanged
  • 我想当你改变它时你仍然需要打电话给OnPropertyChanged(nameof(ExistInDatabase))。该框架不会为您神奇地做到这一点。

标签: c# binding prism ivalueconverter


【解决方案1】:

你仍然需要调用 OnPropertyChanged(nameof(ExistInDatabase)) 时 我想你改变它。该框架不会为您神奇地做到这一点。 ——别斯Grr

感谢您的小费别丝!我确实设法解决了这个问题。

我已经修改了模型 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 都会被触发并刷新 UI。

ListView

【讨论】:

    猜你喜欢
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多