C# IValueConverter未更新图像源

C# IValueConverter未更新图像源,c#,binding,prism,ivalueconverter,C#,Binding,Prism,Ivalueconverter,我的ViewModel中有一个可见集合: private ObservableCollection<Component> _standardComponents; public ObservableCollection<Component> StandardComponents { get { return _standardComponents; } set { SetProperty(ref _sta

我的ViewModel中有一个可见集合:

 private ObservableCollection<Component> _standardComponents;
 public ObservableCollection<Component> StandardComponents
        {
            get { return _standardComponents; }
            set { SetProperty(ref _standardComponents, value); }
        }
正在根据用户操作进行更改

我使用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不会被触发

这是我的列表视图:

您仍然需要在以下情况下调用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属性,就会触发ChangedEvent并刷新UI


您是否为您的ViewModel实现了
INotifyPropertyChanged
,并在
现有数据库发生更改时调用事件?我使用Prism,因此我的ViewModel从ViewModelBase派生,而我的ViewModelBase从实现INotifyPropertyChanged的BindableBase派生您仍然需要调用
OnPropertyChanged(nameof(ExistInDatabase))
当您更改它时,我想。那个框架不会神奇地为您做这件事。
public event PropertyChangedEventHandler PropertyChanged;

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