我有一个WPF ListView,我添加了包含字符串和图像的对象。图像应该像星星一样,根据对象的其他内容有条件地显示。在我的XAML中,我将它绑定到一个名为“Brand”的属性,该属性返回一个BitmapImage。如果我总是试图显示图像,一切正常。如果我尝试有条件地显示图像(通过一些C#),我无法让ListView更新。
我尝试过将INotifyPropertyChanged添加到添加到ListView中的对象,以便每当我想要显示图像时我都可以手动触发事件。问题是该事件始终为null。这就像ListView没有订阅它。
<ListView Name="MyListView" Grid.Row="3" SelectionMode="Multiple">
<ListView.View>
<GridView>
<GridViewColumn Header="Brand">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding Brand}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
以下两行是我如何将我的对象添加到ListView。数据从文件中读出,我省略了一些变量设置。
LineItem li = new LineItem();
MyListView.Items.Add( li );
这是类看起来减去其他属性的内容。
public class LineItem : IComparable, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public bool PersistedBrand { get { return m_brand; }
set {
m_brand = value;
Brand = null;
//PropertyChanged(this, new PropertyChangedEventArgs("Brand"));
} }
public BitmapImage Brand
{
get
{
if (ShowBrand)
{
return s_brandImage;
}
else
{
return null;
}
}
set
{
PropertyChanged(this, new PropertyChangedEventArgs("Brand"));
// EXCEPTION HERE ABOVE!
}
}
}
我在这方面的理解是错误的,关于绑定应该如何工作?任何建议都表示赞赏。
MJ
编辑1我添加了更多代码。
答案 0 :(得分:0)
在调用之前检查处理程序是否为null:
public BitmapImage Brand
{
get
{
// ...
}
set
{
if (Equals(value, _brand)) return;
_brand = value;
OnPropertyChanged();
}
}
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}