ObservableCollection不更新ListView

时间:2019-06-25 09:32:24

标签: c# wpf listview observablecollection

我知道,有很多这样的问题,但是我无法使其正常工作...

我有一个带有字符串bool的ObservableCollection。 ListView已绑定到该列表,并具有一个CheckBox和一个TextBox。现在,我需要通过代码检查项目...当我更改bool值时,GUI中什么也没显示。

当我检查ListView项时,集合会更新。

可观察的集合

public ObservableCollection<MvItems> Mailverteiler { get { return _Mailverteiler; } }
public ObservableCollection<MvItems> _Mailverteiler = new ObservableCollection<MvItems>();

public class MvItems
{
  public string MvName { get; set; }
  public bool IsChecked { get; set; }
}

如何“检查”项目:

foreach (MvItems mvitem in Mailverteiler)
{
  mvitem.IsChecked = false;
  if (mvitem.MvName.ToString().Contains(tblFirma.Text))
  {
    mvitem.IsChecked = true;
  }
}

XAML:

<ListView x:Name="lvMailverteiler" Margin="20,10,20,0" FontSize="9" SelectionMode="Extended" Height="260" ItemsSource="{Binding Mailverteiler}">    
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid Width="280" VerticalAlignment="Center">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="50" />
                    <ColumnDefinition Width="230" />
                </Grid.ColumnDefinitions>
                <CheckBox Grid.Column="0" IsChecked="{Binding IsChecked, Mode=TwoWay}"/>
                <TextBlock Grid.Column="1" Text="{Binding MvName}" />
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

如何添加项目:

this.lvMailverteiler.ItemsSource = Mailverteiler;
_Mailverteiler.Add(new MvItems { MvName = group.DisplayName, IsChecked=false });

1 个答案:

答案 0 :(得分:7)

问题是,添加/删除/移动项目时,ObservableCollection引发CollectionChanged事件。 但是,当其中一项的属性更新时,它不会引发PropertyChanged事件。

您需要实现INotifyPropertyChanged接口并在PropertyChanged类的属性设置器上引发MvItems事件。

例如:

public class MvItems : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void  RaisePropertyChanged(
            [System.Runtime.CompilerServices.CallerMemberName]
            string propertyName = null)
    {
        this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private string mvName;
    public string MvName
    {
        get => return mvName; 
        set
        {
            mvName = value;
            RaisePropertyChanged();
        }
    }

    private bool isChecked;
    public bool IsChecked
    {
        get => return isChecked; 
        set
        {
            isChecked = value;
            RaisePropertyChanged();
        }
    }
}

编辑:您将找到许多有关如何在Internet上的设置器中引发Propertychanged事件的示例。 附带说明一下,我更喜欢使用PropertyChanged.Fody在实现 INotifyPropertyChanged 接口的类的设置器中自动添加“引发事件”代码行。