Model-View-ViewModel(MVVM)是一种架构设计模式,用于实现用户界面,通过其表示逻辑(其ViewModel)将UI(View)与其数据(Model)分开。
WPF MVVM ComboBox SelectedItem 不会从 ViewModel 传播到 View
我有一个 MVVM 绑定的 ComboBox 我有一个 MVVM 绑定的 ComboBox <ComboBox ItemsSource="{Binding RootPathItems, Mode=OneTime}" DisplayMemberPath="DisplayName" SelectedItem="{Binding SelectedRootPathItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsSynchronizedWithCurrentItem="True"> </ComboBox> 组合框中的所有项目都是内存唯一的,并在窗口启动时创建。 当用户更改下拉列表中的选择时,将调用 ViewModel 属性设置器,并将正确的对象提供给设置器。然后我根据选择开始一些同步操作,然后然后我想将选择更改为默认选择 private RootPathItem _selectedRootPathItem; public RootPathItem SelectedRootPathItem { get => _selectedRootPathItem; set { if (_selectedRootPathItem != value) { _selectedRootPathItem = value; this.OnPropertyChanged(); SomeAction(); } } } ... //in SomeAction(): this.SelectedRootPathItem = _nothingComboBoxItem; .Net 内部将再次调用属性 getter 并获取 _nothingComboBoxItem,但 UI 将保留在之前选择的项目上,不会切换到默认值。 我也尝试绑定SelectedIndex,效果相同。 我的猜测是因为当我设置一个新项目时我仍然在属性设置器调用堆栈中,这不起作用,但我实际上不知道这里出了什么问题。 仔细查看您的代码库并对其进行测试,在我看来,您关于“仍在属性设置器理论中”的说法是正确的。看来 WPF 不会更新视图,除非您将 this.SelectedRootPathItem = _nothingComboBoxItem 行放入任务中。 而且我还看到您尝试使用交互行为来订阅 ComboBox 的选择更改事件,我认为这是一个比在属性设置器中做很多事情更清晰的方法。这个想法怎么了?我看到 xaml 代码被注释掉了。 我添加了nuget包,将交互行为代码放回xaml中,删除了setter中的_rootPathItemSelectionChangedCommand.Execute(null);行,它完美地工作了。
我应该在 ViewModel 中包含 LifecycleOwner 吗?
当前需要 LifecycleOwner 才能创建观察者。 我有在 ViewModel 中创建观察者的代码,因此在我的
WPF DataGrid - RowDetails DataContext
背景 我有以下 DataGrid,其中有两列用于描述和状态。它们绑定到一个名为 RowViewModels 的 ObservableCollection ,它作为 ...
所以我之前的问题似乎无法回答,所以我将根据自己的建议尝试一下。 我正在寻找的功能是让数据网格改变前景(甚至
我正在 WPF 中创建一个基本的数据库应用程序,并且我已经开始使用 MVVM 模式。 我有一个对话框,要求用户从列表框中选择一个项目,然后单击“确定”。之后,我...
学习 WPF 和 MVVM - 从头开始学习的最佳方法[已关闭]
我有大约三年的 c# 经验。我想学习一些 WPF 和 MVVM 模式。 该网站上有很多文章的链接,但我有点不知所措。 明智的
我真的很难让文本框绑定到字符串变量,并且在互联网上尝试了各种解决方案,但没有成功。也许有人可以指出我做错了什么? 嗯...
“我目前正在开发一个 .NET MAUI 项目。假设用户可以使用同一个按钮开始和停止录制。我希望在录制时有连续的动画,并且当按钮...
WPF MVVM ComboBox SelectedItem 返回上一个项目
我有一个 MVVM 绑定的 ComboBox 我有一个 MVVM 绑定的 ComboBox <ComboBox x:Name="CBRootPathComboBox" ItemsSource="{Binding RootPathComboBoxItems, Mode=OneTime}" DisplayMemberPath="DisplayName" SelectedItem="{Binding SelectedRootPathComboBoxItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> <i:Interaction.Triggers> <i:EventTrigger EventName="SelectionChanged"> <i:InvokeCommandAction Command="{Binding RootPathComboBoxItemSelectionChangedCommand}" CommandParameter="{Binding ElementName=CBRootPathComboBox, Path=SelectedItem}" /> </i:EventTrigger> </i:Interaction.Triggers> </ComboBox> Interaction 来自 Microsoft.Xaml.Behaviors.Wpf nuget。 在 SelectionChanged 上,我期望看到 ICommand 以及列表中当前选定的项目。 在 ViewModel 中,我在代码中的某个位置设置了 SelectedItem。 我使用 ViewModel 属性在 ViewModel 中将其从“Item2”设置为“Item1”。 调用链如下: 1. set the property to "Item1" 2. Raise INotifyPropertyChanged.PropertyChanged event 3. .Net internals calls property getter, it returns "Item1" 4. ICommand call contains "Item2" in parameter. Expected: "Item1" ViewModel 属性: private RootPathItem _selectedRootPathComboBoxItem; public RootPathItem SelectedRootPathComboBoxItem { get { Debug.WriteLine($"getting {_selectedRootPathComboBoxItem?.DisplayName ?? "null"}"); return _selectedRootPathComboBoxItem; } set { Debug.WriteLine($"setting {value?.DisplayName ?? "null"}"); if (_selectedRootPathComboBoxItem != value) { Debug.WriteLine($"overwriting {_selectedRootPathComboBoxItem?.DisplayName ?? "null"}"); _selectedRootPathComboBoxItem = value; this.OnPropertyChanged(); } } } XAML:https://github.com/DJDoena/FolderSize/blob/bc0f316a321a5a1a752c4dd12484e2d8684b3700/View/MainWindow.xaml ViewModel:https://github.com/DJDoena/FolderSize/blob/bc0f316a321a5a1a752c4dd12484e2d8684b3700/ViewModel/MainViewModel.cs 几种解决方案。 无需使用事件。在虚拟机中实现所需的逻辑。对于您的代码来说,最简单的形式将是这样的: private RootPathItem _selectedRootPathComboBoxItem; public RootPathItem SelectedRootPathComboBoxItem { get { Debug.WriteLine($"getting {_selectedRootPathComboBoxItem?.DisplayName ?? "null"}"); return _selectedRootPathComboBoxItem; } set { Debug.WriteLine($"setting {value?.DisplayName ?? "null"}"); if (_selectedRootPathComboBoxItem != value) { Debug.WriteLine($"overwriting {_selectedRootPathComboBoxItem?.DisplayName ?? "null"}"); _selectedRootPathComboBoxItem = value; this.OnPropertyChanged(); RootPathComboBoxItemSelectionChangedExecute(value); } } } 从事件参数中检索新选定的元素: <ComboBox x:Name="CBRootPathComboBox" ItemsSource="{Binding RootPathComboBoxItems, Mode=OneTime}" DisplayMemberPath="DisplayName" SelectedItem="{Binding SelectedRootPathComboBoxItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> <i:Interaction.Triggers> <i:EventTrigger EventName="SelectionChanged"> <i:InvokeCommandAction Command="{Binding RootPathComboBoxItemSelectionChangedCommand}" EventArgsParameterPath="AddedItems[0]" /> </i:EventTrigger> </i:Interaction.Triggers> </ComboBox> 您可以使用 BeginInvoke 从事件异步调用命令,但为此您必须使用 i:Interaction.Behaviors 而不是 i:Interaction.Triggers。代码中稍微复杂一些的是 InvokeCommandAction 与 Behavior。
我有一个应用程序,它应该在启动时检查位置服务是否打开或关闭。我尝试使用 AlerDialog,并通过 Intent 将用户发送到设置,但它不起作用......
如何在 MVVM 中处理 ComboBox SelectionChanged?
对于那些使用纯 MVVM 的人来说,如何处理 ComboBox SelectionChanged 事件而不恢复到代码隐藏? 我尝试过例如不支持 AttachedBehaviors 但 Event="SelectedChanged": <
在 .NET MAUI (MVVM) 中从另一个 ViewModel 添加项目时如何确保 CollectionView 更新
我正在开发一个带有两个 CollectionView 的 .NET MAUI 应用程序: 公共 ObservableCollection CourseGroups { get; } = 新的 ObservableCollection(); 公开
我正在尝试在 DataGrid 列中的其他数据旁边显示图像。 我的模型看起来像这样: 公开课人物 { 公共字符串名称{获取;放; } 公共字符串地址{获取;放; ...
c# WPF MVVM Datagrid 按钮将 TextBlock 绑定到 DataContext
我在用户控件中有一个数据网格。 UserControl 连接到保存 DataGrid 数据的 ViewModel。在本例中,数据是联系人的数据。我想做“...
我正在尝试将两个布尔属性绑定到两个单选按钮。当表单加载时,两个单选按钮均处于未选中状态。当我单击第一个单选按钮时,它被选中。然而,当...
在 MVVM 中为什么人们要创建 ViewModel 文件夹?
...而不是使用 xxx.xaml.cs 生成的文件? 开发人员正在 Views 文件夹中的 xaml 中创建一个视图。 Visual Studio 在 xaml 文件下生成 xaml.cs 文件。但开发者更喜欢
======= 所以我决定将我的 ASP.NET 站点开发为 Silverlight。 我今天开始搜索有关我想在 Silverlight 应用程序中使用的 MVVM 模式的文章,我很困惑:/很难...
要么是我没有看到解决方案,要么是我在使用 MVVM 时发现了一个陷阱。 我有这个示例主细节: 类客户 { int CustomerID {获取;设置} 字符串名称 {get;set} ObservableCollect...
我正在阅读MVC、MVP、MVVM之间的区别 来源:这里 我的疑问是,图表(MVP)(MVVM)显示了Modle和Presenter、Model和ViewModel之间的双向箭头。 演示者和视图...
为什么我的 WPF 应用程序首次启动时显示 ViewModel 的类名而不是其内容(属性)?
我将 MainWindowViewModel 绑定到 MainWindow 的 DataContext。 然后我将此 MainWindowViewModel 初始化为特定的 itemsPageViewModel。 问题是在启动时我看到 itemsPageViewMode...