IValueConverter不更新图像源

时间:2018-05-30 06:23:36

标签: c# binding prism ivalueconverter

我在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: ListView

1 个答案:

答案 0 :(得分:0)

  

您还需要在何时调用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并刷新UI。

ListView