我在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
答案 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。