基于布尔字段填充 Listview
Populating Listview based on boolean field
我正在尝试根据列表中每个项目的布尔字段填充列表视图。我无法理解我应该如何实施这个。因此,基本上,每次我单击 add 或 delete[= 时,用户列表都会更新40=]。但是,我想做的是 - 不要从列表中删除用户,而是在用户单击 delete 并在用户点击 Add 时设置为 true .基于此,用户将只能看到列表中其值将设置为 true 的项目。因此,简而言之,程序的输出将与我当前的程序相同。除了当用户单击 Delete 时,他们实际上不会从列表中删除该元素,但仍会继续看不到UI 中的那个项目。这是我的示例 XAML、代码隐藏和模型。
代码隐藏:
public partial class MainWindow : Window
{
private ObservableCollection<User>users = new ObservableCollection<User>();
public MainWindow()
{
InitializeComponent();
users.Add(new User() { Name = "John Smith" });
users.Add(new User() { Name = "Brad Pitt" });
lbUsers.ItemsSource = users;
}
private void btnAddUser_Click(object sender, RoutedEventArgs e)
{
users.Add(new User() { Name = "New user" });
}
private void btnChangeUser_Click(object sender, RoutedEventArgs e)
{
if (lbUsers.SelectedItem != null)
{
(lbUsers.SelectedItem as User).Name = "Random Name";
}
}
private void btnDeleteUser_Click(object sender, RoutedEventArgs e)
{
if (lbUsers.SelectedItem != null)
//users.Remove(lbUsers.SelectedItem as User);
{
User delted = lbUsers.SelectedItem as User;
delted.IsRemoved = true;
}
}
}
型号:
public class User : INotifyPropertyChanged
{
private string name;
private bool isRemoved;
public event PropertyChangedEventHandler PropertyChanged;
public String Name
{
get { return this.name; }
set
{
if (this.name != value)
{
this.name = value;
this.NotifyPropertyChanged("Name");
}
}
}
public bool IsRemoved
{
get { return this.isRemoved; }
set
{
if (this.isRemoved != value)
{
this.isRemoved = value;
this.NotifyPropertyChanged("IsRemoved");
}
}
}
public void NotifyPropertyChanged(string propName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
XAML:
<DockPanel Margin="10">
<StackPanel DockPanel.Dock="Right" Margin="10,0,0,0">
<Button Name="btnAddUser" Click="btnAddUser_Click">Add user</Button>
<Button Name="btnChangeUser" Click="btnChangeUser_Click" Margin="0,5">Change user</Button>
<Button Name="btnDeleteUser" Click="btnDeleteUser_Click">Delete user</Button>
</StackPanel>
<Border BorderBrush="Gainsboro" BorderThickness="1">
<ListView Name="lbUsers">
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsRemoved}" Value="true">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Border>
</DockPanel>
得到了有效的解决方案。
使用更改修改了问题中的代码。编辑说明包含更新。
我正在尝试根据列表中每个项目的布尔字段填充列表视图。我无法理解我应该如何实施这个。因此,基本上,每次我单击 add 或 delete[= 时,用户列表都会更新40=]。但是,我想做的是 - 不要从列表中删除用户,而是在用户单击 delete 并在用户点击 Add 时设置为 true .基于此,用户将只能看到列表中其值将设置为 true 的项目。因此,简而言之,程序的输出将与我当前的程序相同。除了当用户单击 Delete 时,他们实际上不会从列表中删除该元素,但仍会继续看不到UI 中的那个项目。这是我的示例 XAML、代码隐藏和模型。
代码隐藏:
public partial class MainWindow : Window
{
private ObservableCollection<User>users = new ObservableCollection<User>();
public MainWindow()
{
InitializeComponent();
users.Add(new User() { Name = "John Smith" });
users.Add(new User() { Name = "Brad Pitt" });
lbUsers.ItemsSource = users;
}
private void btnAddUser_Click(object sender, RoutedEventArgs e)
{
users.Add(new User() { Name = "New user" });
}
private void btnChangeUser_Click(object sender, RoutedEventArgs e)
{
if (lbUsers.SelectedItem != null)
{
(lbUsers.SelectedItem as User).Name = "Random Name";
}
}
private void btnDeleteUser_Click(object sender, RoutedEventArgs e)
{
if (lbUsers.SelectedItem != null)
//users.Remove(lbUsers.SelectedItem as User);
{
User delted = lbUsers.SelectedItem as User;
delted.IsRemoved = true;
}
}
}
型号:
public class User : INotifyPropertyChanged
{
private string name;
private bool isRemoved;
public event PropertyChangedEventHandler PropertyChanged;
public String Name
{
get { return this.name; }
set
{
if (this.name != value)
{
this.name = value;
this.NotifyPropertyChanged("Name");
}
}
}
public bool IsRemoved
{
get { return this.isRemoved; }
set
{
if (this.isRemoved != value)
{
this.isRemoved = value;
this.NotifyPropertyChanged("IsRemoved");
}
}
}
public void NotifyPropertyChanged(string propName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
XAML:
<DockPanel Margin="10">
<StackPanel DockPanel.Dock="Right" Margin="10,0,0,0">
<Button Name="btnAddUser" Click="btnAddUser_Click">Add user</Button>
<Button Name="btnChangeUser" Click="btnChangeUser_Click" Margin="0,5">Change user</Button>
<Button Name="btnDeleteUser" Click="btnDeleteUser_Click">Delete user</Button>
</StackPanel>
<Border BorderBrush="Gainsboro" BorderThickness="1">
<ListView Name="lbUsers">
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsRemoved}" Value="true">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Border>
</DockPanel>
得到了有效的解决方案。 使用更改修改了问题中的代码。编辑说明包含更新。