【问题标题】:ObservableCollection Not updating GUIObservableCollection 不更新 GUI
【发布时间】:2014-08-31 14:25:37
【问题描述】:

我正在尝试使用可观察集合更新我的 UI,但在我的情况下我没有发生这种情况,即使我尝试使用“将数据编组到 Gui 线程”来更新它,这甚至不适合我。这里我正在更新我的代码,请让我知道我错在哪里。 XAML

<DataGrid ItemsSource="{Binding BindFiles, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectionMode="Single"     CanUserSortColumns="False"  x:Name="dataGrid1"    BorderBrush="Transparent" Canvas.Left="1" Canvas.Top="50" Background="{Binding ElementName=gd,Path=Background}"></datgrid>

属性

        ObservableCollection<ProjectTabModel> _BindFiles;
        public ObservableCollection<ProjectTabModel> BindFiles
        {
            get
            {
                return _BindFiles;
            }
            set
            {
                _BindFiles = value;
                RaisePropertyChanged(()=>BindFiles);
            }
        }

查看模型

#region BindProjectFiles
        public void Bindfiletab()
        {

            List<ProjectTabModel> obj = ProjectTabModel.FilesBinding(GlobalProjectID);
            ObservableCollection<ProjectTabModel> obsrvbl = new ObservableCollection<ProjectTabModel>(obj);

            if (obsrvbl.Count > 0)
            {

                BindFiles.Clear();
                foreach (var item in obsrvbl)
                {
                    BindFiles.Add(item);
                }

            }
            else
            {

                NoFileFound = "No File found";
            }
        }



private class DragOverEvent : ProjectTabViewModel, ICommand
        {
            public event EventHandler CanExecuteChanged;
            public void Execute(object sender)
            {
                GalaSoft.MvvmLight.Threading.DispatcherHelper.CheckBeginInvokeOnUI(() =>
         {
//my code stuff here
             }
        });
}

【问题讨论】:

  • 你的代码一团糟。您有一个视图模型类,它也是 ICommand,但名为 ...Event。您正在视图模型中处理 LblMessageForFiles UI 控件,该控件 100% 与 MVVM 相对,因此您显然不了解 MVVM。我建议您在继续您的项目之前,重新阅读和学习 WPF 和 MVVM。您缺少太多的知识,我们无法在这里为您提供帮助……您至少需要在此处提问之前学习基础知识。
  • @Sheridan 根据我的研究,如果我们想对 View 做任何事情,我们会为其创建一个属性并将其绑定到视图中,这也是我正在使用的 ahev 属性“LblMessageForFiles”的情况。但是我面临的问题是,在添加任何新条目后 UI 不会刷新。还有什么你不了解的。
  • 还有什么你不明白的...我???你在开玩笑? System.Windows.Visibility enum 与 UI 相关,并且 属于您的视图模型。为什么我认为LblMessageForFiles 是一个UI 元素?因为出于某种奇怪的原因,您在名称中添加了 Lbl 前缀......再次,您的代码是一团糟。
  • 您没有提供足够的信息,这是无法回答的。您甚至没有显示带有绑定的 xaml。提供重现问题的最少代码,请参阅stackoverflow.com/help/mcve。附带说明:是的,这段代码远低于标准。
  • 暴露 ObservableCollections 的属性应该是只读的。您应该从集合中添加/删除项目。

标签: wpf mvvm observablecollection


【解决方案1】:

我想说你的代码确实需要重构。使用下面的代码更改您的代码,将断点设置为 BindFiles 并跟踪其状态。顺便说一句,您不应该在 ViewModel 中编写与 UI 相关的代码,例如 Visibility.Hidden。只需定义一个属性来更改控件的可见性状态。

public void BindFileTab()
 {
        List<ProjectTabModel> obj = ProjectTabModel.FilesBinding(GlobalProjectID);
        BindFiles = new ObservableCollection<ProjectTabModel>(obj);
        LblMessageForFiles = Visibility.Hidden;
        if (BindFiles.Count > 0)
        {
            LblMessageForFiles = Visibility.Hidden;                
        }
        else
        {
            LblMessageForFiles = Visibility.Visible;
            NoFileFound = "No File found";
        }
    }

【讨论】:

  • 既然你谈到重构,请使用var 而不是拼写完整的类型,正确的变量名也无妨。除此之外,我不确定这段代码是否会有所作为,甚至不确定它是否是 ObservableCollection 的使用方式。您只是在此处交换属性下方的后端,因此没有理由首先使用 Observablecollection,因为重点是在添加/删除时获得更新。
  • @Abdurrahman Köken 感谢您的回答,但此代码会产生更多问题,即它现在停止将代码与数据网格绑定。
  • vishuminhas:它可能不起作用,因为您没有提供有关代码的详细信息。你应该提供更多信息。 @stijn 非常感谢。我非常感谢你。我不知道“重构”是什么意思。
猜你喜欢
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多