C# 将对象内部的ObservableCollection绑定到ListView时出现问题

C# 将对象内部的ObservableCollection绑定到ListView时出现问题,c#,wpf,binding,observablecollection,inotifypropertychanged,C#,Wpf,Binding,Observablecollection,Inotifypropertychanged,我的WPF列表视图 <ListView Name="lstTasks" ItemContainerStyle="{StaticResource itemstyle}" ItemsSource="{Binding ElementName=TaskFile,Path=obscollFiles}" SelectionMode="Single"> <ListView.View> <GridView>

我的WPF列表视图

        <ListView Name="lstTasks" ItemContainerStyle="{StaticResource itemstyle}" ItemsSource="{Binding ElementName=TaskFile,Path=obscollFiles}" SelectionMode="Single">
           <ListView.View>
               <GridView>
                    <GridViewColumn Header="Id" DisplayMemberBinding="{Binding TaskId}" />
                    <GridViewColumn Header="Datum" DisplayMemberBinding="{Binding TaskDate,StringFormat={}{0:dd.MM.yyyy}}" />
                    <GridViewColumn Header="Startzeit" DisplayMemberBinding="{Binding TaskStartTime,StringFormat=t}" />
                    <GridViewColumn Header="Endzeit" DisplayMemberBinding="{Binding TaskEndTime,StringFormat=t}" />
                    <GridViewColumn Header="Dauer" DisplayMemberBinding="{Binding TaskDuration}" />
                    <GridViewColumn Header="Task" DisplayMemberBinding="{Binding TaskString}" />
               </GridView>
           </ListView.View>
       </ListView>
一些关于错误的提示或指示会非常好:)

非常感谢

问候 丹尼尔

编辑:

我在csTask内部实现了INotifyPropertyChanged。 (在csTaskFile内部的ObservableCollection中使用它)

我的主窗口的代码如您所愿:):

FileSystemWatcher FileWatcher;
公共csTaskFileInfo任务文件{get;set;}
公共列表文件{get;set;}
私有字符串_FolderPath;
公共字符串折叠路径
{
获取{return\u FolderPath;}
设置
{
_FolderPath=值;
通知(“FolderPath”);
}
}
public DirectoryInfo FolderDirectory{get;set;}
公共主窗口()
{
初始化组件();
TaskFile=new csTaskFileInfo();
TaskFile.DateOfTasks=DateTime.Now;
obscollFiles=新列表();
this.DataContext=this;
RegistryKey _RegKey=Registry.CurrentUser.OpenSubKey(“软件\\WTT”);
如果(_RegKey==null)
{
FolderPath=Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)+“\\WTT\U文件”;
}
其他的
{
FolderPath=(字符串)\ u RegKey.GetValue(“FolderDestination”)+“\\WTT\u文件”;
}
if(Directory.Exists(FolderPath)==false)
{
CreateDirectory(FolderPath);
}
FolderDirectory=新目录信息(FolderPath);
FileWatcher=newfilesystemwatcher(FolderPath,*.xml);
FileWatcher.Created+=新的文件系统EventHandler(FileWatcher\u已更改);
FileWatcher.Deleted+=新的文件系统EventHandler(FileWatcher\u已更改);
//FileWatcher.Changed+=新文件系统EventHandler(FileWatcher\u已更改);
FileWatcher.重命名+=新重命名的EventHandler(FileWatcher\u已更改);
FileWatcher.EnableRaisingEvents=true;
FileWatcher_已更改(null,null);
变量_temp=来自OBSCOLL文件中的n
其中n.Name==(DateTime.Today.ToShortDateString()+“.xml”)
选择n;
如果(_temp.Count()==1)
{
lstFiles.SelectedItem=_temp.Single()作为文件信息;
}
}
私有void FileWatcher_已更改(对象发送方、文件系统目标)
{
obscollFiles=FolderDirectory.GetFiles(“*.xml”).ToList();
通知(“文件”);
}
私有void NewTask\u单击(对象发送方,路由目标)
{
TaskStringWindow_newTaskStringWindow=新TaskStringWindow();
_newTaskStringWindow.Owner=this;
_newTaskStringWindow.txteningabe.Focus();
_newTaskStringWindow.ShowDialog();
if(_newTaskStringWindow.DialogResult==true)
{
csTask _newTask=新csTask();
if(TaskFile.obscollTasks!=null&&TaskFile.obscollTasks.Count>0)
{
csTask_先前的任务;
_previousTask=TaskFile.obscollTasks.Last();
_previousTask.TaskEndTime=TimeSpan.Parse(DateTime.Now.ToLongTimeString());
_newTask.TaskId=_previousTask.TaskId+1;
_newTask.TaskDate=TaskFile.DateOfTasks;
_newTask.TaskStartTime=TimeSpan.Parse(DateTime.Now.ToLongTimeString());
}
其他的
{
_newTask.TaskId=1;
_newTask.TaskDate=DateTime.Now;
_newTask.TaskStartTime=TimeSpan.Parse(DateTime.Now.ToLongTimeString());
}
_newTask.taskstringwindow.txtEingabe.Text;
TaskFile.obscollTasks.Add(_newTask);
//lstasks.DataContext=TaskFile.obscollTasks;
}
}
私有void SaveCurrentFile\u单击(对象发送方,路由目标)
{
XmlSerializer XmlSer=新的XmlSerializer(typeof(csTaskFileInfo));
if(Directory.Exists(FolderPath)==false)
{
CreateDirectory(FolderPath);
}
FileStream stream=新的FileStream(FolderPath++“\”+DateTime.Now.ToSortDateString()+“.xml”,FileMode.Create);
序列化(流、任务文件);
stream.Close();
}
私有void ResetSearchByDate_单击(对象发送方,路由目标)
{
//lstasks.DataContext=TaskFile.obscollTasks;
}
私有无效加载文件\u单击(对象发送方,路由目标)
{
OpenFileDialog OpenFile=新建OpenFileDialog();
Filter=(“XAML DATIEN |*.xml”);
if(OpenFile.ShowDialog(this)==true)
{
TaskFile.obscollTasks.Clear();
FileInfo _tempFileInfo=新文件信息(OpenFile.FileName);
添加(_tempFileInfo);
lstFiles.SelectedItem=\u tempFileInfo;
}
}
私有void加载文件(FileInfo文件)
{
尝试
{
//XmlSerializer XmlSer=新的XmlSerializer(typeof(csTaskFileInfo));
//FileStream stream=新FileStream(File.FullName,FileMode.Open);
//TaskFile=(csTaskFileInfo)XmlSer.Deserialize(stream);
使用(FileStream fStream=newfilestream(File.FullName,FileMode.Open))
{
XmlSerializer XmlSer=新的XmlSerializer(typeof(csTaskFileInfo));
使用(StreamReader sReader=newstreamreader(fStream,Encoding.UTF8))
{
TaskFile=(csTaskFileInfo)XmlSer.Deserialize(sReader);
//lstasks.DataContext=TaskFile.obscollTasks;
}
}
}
捕获(例外情况除外)
{
Show(例如InnerException.ToString(),“Fehler”,MessageBoxButton.OK,MessageBoxImage.Error);
}
}
私有void SetFolder_单击(对象发送者,路由目标e)
{
System.Windows.Forms.FolderBrowserDialog _SelectFolder=new System.Windows.Forms.FolderBrowserDialog();
系统
    public class csTaskFileInfo
{
    public DateTime DateOfTasks { get; set; }
    public ObservableCollection<csTask> obscollTasks { get; set; }

    public csTaskFileInfo()
    {
        obscollTasks = new ObservableCollection<csTask>();
    }
}
[Serializable]
public class csTask:INotifyPropertyChanged
{
    private int _TaskId;
    private string _TaskString;
    private DateTime _TaskDate;
    private TimeSpan _TaskStartTime;
    private TimeSpan _TaskEndTime;
    private TimeSpan _TaskDuration;

    [XmlIgnore]
    public TimeSpan TaskDuration
    {
        get { return _TaskDuration; }
        set
        {
            _TaskDuration = value;
            Notify("TaskDuration");
        }
    }
    [XmlIgnore]
    public TimeSpan TaskEndTime
    {
        get { return _TaskEndTime; }
        set
        {
            _TaskEndTime = value;

            if (TaskEndTime > TaskStartTime)
            {
                TaskDuration = TaskEndTime - TaskStartTime;
            }

            Notify("TaskEndTime");
        }
    }
    [XmlIgnore]
    public TimeSpan TaskStartTime
    {
        get { return _TaskStartTime; }
        set
        {
            _TaskStartTime = value;

            if (_TaskStartTime < _TaskEndTime)
            {
                TaskDuration = TaskEndTime - TaskStartTime;
            }

            Notify("TaskStartDate");
        }
    }
    public DateTime TaskDate
    {
        get { return _TaskDate; }
        set
        {
            _TaskDate = value;
            Notify("TaskDate");
        }
    }

    [XmlElement("TaskDurationString")]
    public string TaskDurationString { get { return TaskDuration.ToString(); } set { TaskDuration = TimeSpan.Parse(value); } }
    [XmlElement("TaskEndTimeString")]
    public string TaskEndTimeString { get { return TaskEndTime.ToString(); } set { TaskEndTime = TimeSpan.Parse(value); } }
    [XmlElement("TaskStartTimeString")]
    public string TaskStartTimeString { get { return TaskStartTime.ToString(); } set { TaskStartTime = TimeSpan.Parse(value); } }


    public string TaskString
    {
        get { return _TaskString; }
        set
        {
            _TaskString = value;
            Notify("TaskString");
        }
    }
    public int TaskId
    {
        get { return _TaskId; }
        set
        {
            _TaskId = value;
            Notify("TaskId");
        }
    }

    public csTask(int TaskId, string TaskString,DateTime TaskDate)
    {
        this.TaskId = TaskId;
        this.TaskString = TaskString;
        this.TaskDate = TaskDate;
    }

    public csTask()
    {

    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void Notify(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
this.Datacontext = this;
FileSystemWatcher FileWatcher;
    public csTaskFileInfo TaskFile { get; set; }
    public List<FileInfo> obscollFiles { get; set; }
    private string _FolderPath;
    public string FolderPath
    {
        get { return _FolderPath; }
        set
        {
            _FolderPath = value;
            Notify("FolderPath");
        }
    }
    public DirectoryInfo FolderDirectory { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        TaskFile = new csTaskFileInfo();
        TaskFile.DateOfTasks = DateTime.Now;
        obscollFiles = new List<FileInfo>();
        this.DataContext = this;
        RegistryKey _RegKey = Registry.CurrentUser.OpenSubKey("Software\\WTT");

        if (_RegKey == null)
        {
            FolderPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\WTT_Files";
        }
        else
        {
            FolderPath = (string)_RegKey.GetValue("FolderDestination") + "\\WTT_Files";
        }

        if (Directory.Exists(FolderPath) == false)
        {
            Directory.CreateDirectory(FolderPath);
        }

        FolderDirectory = new DirectoryInfo(FolderPath);

        FileWatcher = new FileSystemWatcher(FolderPath,"*.xml");
        FileWatcher.Created += new FileSystemEventHandler (FileWatcher_Changed);
        FileWatcher.Deleted += new FileSystemEventHandler (FileWatcher_Changed);
        //FileWatcher.Changed += new FileSystemEventHandler(FileWatcher_Changed);
        FileWatcher.Renamed += new RenamedEventHandler(FileWatcher_Changed);
        FileWatcher.EnableRaisingEvents = true;
        FileWatcher_Changed(null,null);

        var _temp = from n in obscollFiles
                    where n.Name == (DateTime.Today.ToShortDateString() + ".xml")
                    select n;
        if (_temp.Count() == 1)
        {
            lstFiles.SelectedItem = _temp.Single() as FileInfo;
        }
    }

    private void FileWatcher_Changed(object sender, FileSystemEventArgs e)
    {
        obscollFiles = FolderDirectory.GetFiles("*.xml").ToList();
        Notify("obscollFiles");
    }

    private void NewTask_Click(object sender, RoutedEventArgs e)
    {

        TaskStringWindow _newTaskStringWindow = new TaskStringWindow();
        _newTaskStringWindow.Owner = this;
        _newTaskStringWindow.txtEingabe.Focus();
        _newTaskStringWindow.ShowDialog();

        if (_newTaskStringWindow.DialogResult == true)
        {
            csTask _newTask = new csTask();
            if (TaskFile.obscollTasks != null && TaskFile.obscollTasks.Count > 0)
            {
                csTask _previousTask;
                _previousTask = TaskFile.obscollTasks.Last();

                _previousTask.TaskEndTime = TimeSpan.Parse(DateTime.Now.ToLongTimeString());

                _newTask.TaskId = _previousTask.TaskId + 1;
                _newTask.TaskDate = TaskFile.DateOfTasks;
                _newTask.TaskStartTime = TimeSpan.Parse(DateTime.Now.ToLongTimeString());
            }
            else
            {
                _newTask.TaskId = 1;
                _newTask.TaskDate = DateTime.Now;
                _newTask.TaskStartTime = TimeSpan.Parse(DateTime.Now.ToLongTimeString());
            }
            _newTask.TaskString = _newTaskStringWindow.txtEingabe.Text;
            TaskFile.obscollTasks.Add(_newTask);
            //lstTasks.DataContext = TaskFile.obscollTasks;
        }
    }

    private void SaveCurrentFile_Click(object sender, RoutedEventArgs e)
    {
        XmlSerializer XmlSer = new XmlSerializer(typeof(csTaskFileInfo));

        if (Directory.Exists(FolderPath) == false)
        {
            Directory.CreateDirectory(FolderPath);
        }
        FileStream stream = new FileStream(FolderPath + @"\" + DateTime.Now.ToShortDateString() + ".xml", FileMode.Create);
        XmlSer.Serialize(stream, TaskFile);
        stream.Close();

    }

    private void ResetSearchByDate_Click(object sender, RoutedEventArgs e)
    {
        //lstTasks.DataContext = TaskFile.obscollTasks;
    }

    private void LoadFile_Click(object sender, RoutedEventArgs e)
    {
        OpenFileDialog OpenFile = new OpenFileDialog();
        OpenFile.Filter = ("XAML-Dateien |*.xml");
        if (OpenFile.ShowDialog(this) == true)
        {
            TaskFile.obscollTasks.Clear();
            FileInfo _tempFileInfo = new FileInfo(OpenFile.FileName);
            obscollFiles.Add(_tempFileInfo);
            lstFiles.SelectedItem = _tempFileInfo;
        }
    }

    private void LoadFile(FileInfo File)
    {
        try
        {
        //XmlSerializer XmlSer = new XmlSerializer(typeof(csTaskFileInfo));
        //FileStream stream = new FileStream(File.FullName, FileMode.Open);
        //TaskFile = (csTaskFileInfo)XmlSer.Deserialize(stream);
            using (FileStream fStream = new FileStream(File.FullName,FileMode.Open))
            {
                XmlSerializer XmlSer = new XmlSerializer(typeof(csTaskFileInfo));

                using (StreamReader sReader = new StreamReader(fStream,Encoding.UTF8))
                {
                    TaskFile = (csTaskFileInfo)XmlSer.Deserialize(sReader);
                    //lstTasks.DataContext = TaskFile.obscollTasks;
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.InnerException.ToString(),"Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
        }
    }

    private void SetFolder_Click(object sender, RoutedEventArgs e)
    {
        System.Windows.Forms.FolderBrowserDialog _SelectFolder = new System.Windows.Forms.FolderBrowserDialog();

        System.Windows.Forms.DialogResult _result = _SelectFolder.ShowDialog();

        if (_result == System.Windows.Forms.DialogResult.OK)
        {
            RegistryKey _RegKey = Registry.CurrentUser.OpenSubKey("Software",true);
            _RegKey.CreateSubKey("WTT");
            _RegKey = _RegKey.OpenSubKey("WTT",true);
            _RegKey.SetValue("FolderDestination", _SelectFolder.SelectedPath);
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void Notify(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    private void lstFiles_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
    {
        TaskFile.obscollTasks.Clear();
        LoadFile(lstFiles.SelectedItem as FileInfo);
    }

    private void HandleDoubleClick(object sender,MouseButtonEventArgs e)
    {
        TaskChangeData TaskChange = new TaskChangeData(TaskFile.obscollTasks, lstTasks.SelectedItem as csTask);

        TaskChange.ShowDialog();
    }
<ListView Name="lstTasks" SelectionMode="Single"
ItemContainerStyle="{StaticResource itemstyle}" 
ItemsSource="{Binding Path=TaskFile.obscollTasks}" >
....