Observablecollection没有对它的收集作出反应

时间:2015-03-28 11:03:08

标签: c# wpf

我的ListBox没有对我的ObservableCollection作出反应。

这是我正在谈论的ListBox。

<ListBox x:Name="CreateFieldsList"
         HorizontalAlignment="Left"
         Height="218"
         VerticalAlignment="Top"
         Width="244"
         Margin="0,86,0,0"
         BorderBrush="#FFB9B9B9">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid Margin="4"
                  Width="215"
                  Height="32.96"
                  Background="White">
                <TextBlock Text="{Binding Name}"
                           FontWeight="Normal"
                           FontSize="18.667"
                           Padding="8,3,0,0" />
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

在我的MainWindow中,我像这样准备数据绑定

private ObservableCollection<FieldListItem> _fieldItems;

public MainWindow()
{
    InitializeComponent();
    _fieldItems = new ObservableCollection<FieldListItem>();
    CreateFieldsList.ItemSource = _fieldItems;
}

FieldListItem正在关注

public class FieldListItem : ViewItem
{
    private Field _field;
    public string Name
    {
        get { return _field.Name; }
    }

    public string Value
    {
        get { return _field.Value; }
    }

    public FieldListItem(Field f)
    {
        _field = f;           
    }
}

最后是ViewItem

public class ViewItem : INotifyPropertyChanged
{
    private event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged([CallerMemberName] string caller = "")
    {
        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(caller));
    }

    //The interface forces me to implement this. Why?
    event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged
    {
        add { }
        remove { }
    }
}

我不知道为什么这不起作用。你能帮忙吗?

1 个答案:

答案 0 :(得分:0)

INotifyPropertyChanged接口需要您实现一个事件。您的事件实现不起作用,因为注册和注销被忽略,因为添加和删除块是空的。

在不添加和删除的情况下实施事件:

public class ViewItem : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged([CallerMemberName] string caller = "")
    {
        var copy = PropertyChanged;
        if (copy != null) 
            copy(this, new PropertyChangedEventArgs(caller));
    }
}