C# IValueConverter未更新图像源
我的ViewModel中有一个可见集合: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
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));
}