基于布尔字段填充 Listview

Populating Listview based on boolean field

我正在尝试根据列表中每个项目的布尔字段填充列表视图。我无法理解我应该如何实施这个。因此,基本上,每次我单击 adddelete[= 时,用户列表都会更新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>

得到了有效的解决方案。 使用更改修改了问题中的代码。编辑说明包含更新。