首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在UI上过滤ObservableCollection项目

在UI上过滤ObservableCollection项目
EN

Stack Overflow用户
提问于 2019-06-08 22:02:06
回答 1查看 89关注 0票数 0

我有一个WPF的任务,每个都有完成或挂起的状态,我将查看所有这些项目到一个列表框中,这些任务被序列化为XML文件,这些项目是通过ObersvableCollection链接到UI。

我正在寻找它,所以能够过滤视图上的任务,并能够编辑或创建新的任务,并保存到XML文件中。

我在考虑创建一个名为FilterTask.cs的新类,并使用返回ObersvableCollection项的静态方法Completed(),但我不确定这是否会影响序列化过程。

以下是我的代码

代码语言:javascript
复制
main window XAML

<Window x:Class="UIToDoList_2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:UIToDoList_2"
        mc:Ignorable="d"
        Title="To Do List" Height="290" Width="500" ResizeMode="CanMinimize">
    <Grid Margin="0,0,0,0">
        <StackPanel Name="MainPanel">
            <StackPanel Name="ViewTaskPanel" Margin="10">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="Task" Margin="0,0,10,0"/>
                    <StackPanel Orientation="Vertical">
                        <ListBox x:Name="UITasks"  Width="300" Height="100" VerticalAlignment="Top" Margin="0,0,10,5"
                                 DisplayMemberPath="Name"/>
                        <RadioButton x:Name="ShowAll" Content="Show All"/>
                        <RadioButton x:Name="ShowCompleted" Content="Show Completed" />
                        <RadioButton x:Name="ShowPending" Content="Show Pending"/>
                    </StackPanel>

                    <StackPanel>
                        <Button Content="Mark As Completed" Margin="0,0,0,5"/>
                        <Button Content="Mark As Pending" Margin="0,0,0,5"/>
                        <Button x:Name="DltTaskBtn" Content="Delete Task"
                                Margin="0,0,0,5" Click="DltTaskBtn_Click"/>
                        <Button x:Name="RenameBtn" Content="Rename" Click="RenameBtn_Click"/>
                    </StackPanel>
                </StackPanel>

            </StackPanel>
            <StackPanel Name="AddTaskPanel" Margin="10">
                <TextBlock Text="Add New Task"/>
                <StackPanel Orientation="Horizontal" Margin="2">
                    <TextBlock Text="Task Name" Margin="0,0,10,0"/>
                    <TextBox Name="TaskNameTxt" Width="260"/>
                </StackPanel>
                <StackPanel Orientation="Horizontal">
                    <Button x:Name="AddTaskBtn" Content="Add" Margin="5" Click="AddTaskBtn_Click"/>
                    <Button x:Name="ClearTaskTxt" Content="Clear" Margin="5" Click="ClearTaskTxt_Click"/>
                </StackPanel>
            </StackPanel>
        </StackPanel>
    </Grid>
</Window>

Task.cs

代码语言:javascript
复制
public class Task : INotifyPropertyChanged
    {
        private string _Name;

        public string Name
        {
            get { return this._Name; }
            set
            {
                if (this._Name != value)
                {
                    this._Name = value;
                    this.NotifyPropertyChanged();
                }
            }
        }

        private Status _Status;

        public Status Status
        {
            get { return this._Status; }
            set
            {
                if (this._Status != value)
                {
                    this._Status = value;
                    this.NotifyPropertyChanged();
                }
            }
        }


        public event PropertyChangedEventHandler PropertyChanged;

        public void NotifyPropertyChanged([CallerMemberName] string propName = "")
        {
            if (this.PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propName));
            }
        }
    }

    public enum Status
    {
        Pending = 0,
        Completed = 1
    }

TaskSerialization.cs

代码语言:javascript
复制
    public class TaskSerialization
    {
        public string FileName { get; set; }

        public TaskSerialization(string fileName)
        {
            FileName = fileName;
        }

        /// <summary>
        /// Serialize the task list to XML File
        /// </summary>
        /// <param name="tasks"></param>
        public void SerializeTasks(List<Task> tasks)
        {
            StreamWriter sw = new StreamWriter(FileName);
            XmlSerializer sr = new XmlSerializer(typeof(List<Task>));
            sr.Serialize(sw, tasks);
            sw.Close();
        }

        /// <summary>
        /// Deserialize the taks list form XML file and return as ObservableCollection item
        /// </summary>
        /// <returns></returns>
        public ObservableCollection<Task> DeserializeTasks()
        {
            XmlSerializer sr = new XmlSerializer(typeof(List<Task>));
            FileStream fs = new FileStream(FileName, FileMode.Open);
            return new ObservableCollection<Task>((List<Task>)sr.Deserialize(fs));
        }
    }

Mainwindow.cs

代码语言:javascript
复制
namespace UIToDoList_2
{

    public partial class MainWindow : Window
    {
        private readonly string fileName = "ToDoList.xml";
        private readonly TaskSerialization taskSrlz;
        ObservableCollection<Task> tasks = new ObservableCollection<Task>();
        public MainWindow()
        {
            InitializeComponent();
            taskSrlz = new TaskSerialization(fileName);
            tasks = taskSrlz.DeserializeTasks();
            UITasks.ItemsSource = tasks;
        }

        private void AddTaskBtn_Click(object sender, RoutedEventArgs e)
        {
            AddTask();
        }
        private void DltTaskBtn_Click(object sender, RoutedEventArgs e)
        {
            DeleteTask();
        }

        private void AddTask()
        {
            var taskName = TaskNameTxt.Text;
            if (!string.IsNullOrWhiteSpace(taskName))
            {
                tasks.Add(new Task() { Name = TaskNameTxt.Text, Status = Status.Pending });
                taskSrlz.SerializeTasks(new List<Task>(tasks));
            }
            else
                MessageBox.Show("Task name cannot be null", "Error in Task name", MessageBoxButton.OK, MessageBoxImage.Error);

        }

        private void DeleteTask()
        {
            if(UITasks.SelectedItem != null)
            {
                var selectedTask = (UITasks.SelectedItem as Task);
                tasks.Remove(selectedTask);
                taskSrlz.SerializeTasks(new List<Task>(tasks));
            }
        }

        private void RenameBtn_Click(object sender, RoutedEventArgs e)
        {
            if (UITasks.SelectedItem != null)
            {
                (UITasks.SelectedItem as Task).Name = TaskNameTxt.Text;
                taskSrlz.SerializeTasks(new List<Task>(tasks));
            }
        }

        private void ClearTaskTxt_Click(object sender, RoutedEventArgs e)
        {
            TaskNameTxt.Clear();
        }
    }
}
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56507091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档