wpf listview项目已更新,属性事件处理程序为null

时间:2014-01-08 18:35:26

标签: c# wpf binding

我有一个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我添加了更多代码。

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));
}