ObservableCollection 不更新 ListView
ObservableCollection not updating ListView
我知道,有很多这样的问题,但我无法解决...
我有一个带有字符串、布尔值的 ObservableCollection。 ListView 绑定到它并具有一个 CheckBox 和一个 TextBox。现在我需要通过代码检查一个项目...当我更改 bool 值时,GUI 中什么也没有出现。
当我检查 ListView 项目时,集合得到更新。
ObservableCollections
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; }
}
如何"check"一个项目:
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 });
事实是,ObservableCollection
在项目为 added/deleted/moved 时引发 CollectionChanged
事件。
但是当其中一项的 属性 更新时,它不会引发 PropertyChanged
事件。
您需要实现 INotifyPropertyChanged
接口并在您的 MvItems
class 的 属性 setter 上引发 PropertyChanged
事件.
例如:
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 上找到许多关于如何在 setter 中引发 Propertychanged 事件的示例。
在旁注中,我更喜欢使用 PropertyChanged.Fody 自动在 classes 的 setter 中添加 "raising event" 代码行,实现 INotifyPropertyChanged界面.
我知道,有很多这样的问题,但我无法解决...
我有一个带有字符串、布尔值的 ObservableCollection。 ListView 绑定到它并具有一个 CheckBox 和一个 TextBox。现在我需要通过代码检查一个项目...当我更改 bool 值时,GUI 中什么也没有出现。
当我检查 ListView 项目时,集合得到更新。
ObservableCollections
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; }
}
如何"check"一个项目:
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 });
事实是,ObservableCollection
在项目为 added/deleted/moved 时引发 CollectionChanged
事件。
但是当其中一项的 属性 更新时,它不会引发 PropertyChanged
事件。
您需要实现 INotifyPropertyChanged
接口并在您的 MvItems
class 的 属性 setter 上引发 PropertyChanged
事件.
例如:
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 上找到许多关于如何在 setter 中引发 Propertychanged 事件的示例。 在旁注中,我更喜欢使用 PropertyChanged.Fody 自动在 classes 的 setter 中添加 "raising event" 代码行,实现 INotifyPropertyChanged界面.