WPF Observable Collection 未更新
Posted
技术标签:
【中文标题】WPF Observable Collection 未更新【英文标题】:WPF Observable Collection not updating 【发布时间】:2021-12-25 18:47:47 【问题描述】:我是 WPF 环境中的菜鸟 我一直在寻找解决方案,虽然我确信这只是我还没有理解的非常基本的东西
我正在尝试利用 Observable 集合来更新 Listview 我在视图模型中添加了一个方法,我需要从外部代码调用以将另一个项目添加到列表中。
当我在调试器打开的情况下在 ViewModel 中调用方法 addTask 时,我可以看到它在列表中计数了 1 个项目。但它不会将其添加到 ListView
型号:
public class Tasks : INotifyPropertyChanged
private string taskName;
private string fromTime;
private string toTime;
private string message;
private string taskCreator;
public string TaskName
get
return taskName;
set
taskName = value;
OnPropertyChanged("TaskName");
public string FromTime
get
return fromTime;
set
fromTime = value;
OnPropertyChanged("FromTime");
public string ToTime
get
return toTime;
set
toTime = value;
OnPropertyChanged("ToTime");
public string Message
get
return message;
set
message = value;
OnPropertyChanged("Message");
public string TaskCreator
get
return taskCreator;
set
taskCreator = value;
OnPropertyChanged("TaskCreator");
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
#endregion
视图模型:
class TasksViewModel
public TasksViewModel()
_UsersList.Add(new Tasks() TaskName = "TaskName1", FromTime = "03:00", ToTime = "07:00", TaskCreator = "TaskCreator1", Message = "Hello" );
_UsersList.Add(new Tasks() TaskName = "TaskName2", FromTime = "03:00", ToTime = "07:00", TaskCreator = "TaskCreator2", Message = "Hello" );
_UsersList.Add(new Tasks() TaskName = "TaskName3", FromTime = "03:00", ToTime = "07:00", TaskCreator = "TaskCreator3", Message = "Hello" );
;
public ObservableCollection<Tasks> Tasks
get return _UsersList;
public ObservableCollection<Tasks> _UsersList get; set; = new ObservableCollection<Tasks>();
public void addTask(string taskName, string fromTime, string toTime, string taskCreator, string message)
_UsersList.Add(new Tasks() TaskName = taskName, FromTime = fromTime, ToTime = toTime, TaskCreator = taskCreator, Message = message );
我要更新的列表视图 (Xaml)
<ListView Name="TaskGrid1" Grid.Row="1" Grid.Column="1" Margin="4,4,12,13" ItemsSource="Binding Tasks" RenderTransformOrigin="0.5,0.5" FontSize="30" >
<ListView.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform Angle="0"/>
<TranslateTransform/>
</TransformGroup>
</ListView.RenderTransform>
<ListView.View>
<GridView x:Name="List00000600">
<GridViewColumn Header="Tid" DisplayMemberBinding="Binding FromTime" Width="100"/>
<GridViewColumn Header="Opgave" DisplayMemberBinding="Binding TaskName" Width="350" />
<GridViewColumn Header="Opretter" DisplayMemberBinding="Binding TaskCreator" Width="120" />
</GridView>
</ListView.View>
</ListView>
【问题讨论】:
那么你在哪里分配DataContext? (这是绑定的默认来源)缺少 xaml 的代码隐藏的地方。 测试了您的代码(并添加了一个调用“addTask”的按钮)并且它可以工作。可能你的虚拟机实例不止一个......所以如何创建和绑定 DataContext 是一个很好的问题...... 在 app.xaml 文件中完成:TasksViewModel VM = new TasksViewModel(); window.DataContext = VM; 您有两个公开相同集合的公共属性。 (_UserLists 和任务)。这有点奇怪,您可以完全用 Tasks 替换 _UserLists。但这不是不更新的原因 仔细想想,这很可能是我调用 addTask 的方式不正确。它是用这个类完成的:public async void TasksCreate() TasksViewModel tasks = new TasksViewModel(); tasks.addTask("Clean", "03:00", "07:00", "Mor", "messsaaaage");
这是从外部调用视图模型中的方法的完全错误的方式吗?
【参考方案1】:
我不知道你是如何在 app.xaml 中分配视图模型的。
只需打开 xaml 文件,其中包含您的列表视图并照常构建您的窗口:
<Window
... (rest of xmlns)
xmlns:MyViewModels="clr-namespace:YourViewModelNamespace"
>
<Window.DataContext>
<MyViewModels:TasksViewModel/>
</Window.DataContext>
<Grid/Or any container>
...
<ListView... />
</Grid/Or any container
</Window>
如前所述,将 _UserList 替换为 Tasks。
您的异步 TasksCreate() 正在创建 TasksViewModel 的新实例,因此它永远不会更新当前实例。
PS:你可以通过以下方式获取viewmodel:
// this function belongs to mainwindow/anywindow
public void CodeBehindClickEvent(object sender, RoutedEventArgs e)
var VM = (TasksViewModel)this.DataContext;
VM.addTask("blabla", ...)
VM.TasksCreate();
【讨论】:
谢谢!是的,我突然意识到它可能正在创建视图模型的多个实例!以上是关于WPF Observable Collection 未更新的主要内容,如果未能解决你的问题,请参考以下文章
在 WPF 中将列表框绑定到字符串类型的 Observable 集合
Observable Collection 未更新(可观察的类项集合内的字符串的可观察集合)
c#wpf combobox将source绑定到一个collection,item作为另一个collection的属性