【问题标题】:Populating Listview based on boolean field基于布尔字段填充 Listview
【发布时间】:2018-09-13 07:21:12
【问题描述】:

我正在尝试根据列表中每个项目的布尔字段填充列表视图。我无法理解我应该如何实施这一点。因此,基本上,每次我点击 adddelete 时,都会更新用户列表。但是,我想要做的是 - 不要从列表中删除用户,而是在用户点击 isRemoved) em>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>

【问题讨论】:

  • 相关link
  • 引用链接后更新了三个文件的更改。不知道我哪里出错了。
  • 让它工作并更新了上面的代码。但是,当我禁用可见性时,我看到这个地方是空白的。我希望能按顺序看到它们。用截图更新了问题。

标签: wpf listview inotifypropertychanged listviewitem


【解决方案1】:

得到了有效的解决方案。 通过更改修改了问题中的代码。编辑注释包含更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 2017-06-23
    • 2017-07-14
    相关资源
    最近更新 更多