mvvm 相关问题

Model-View-ViewModel(MVVM)是一种架构设计模式,用于实现用户界面,通过其表示逻辑(其ViewModel)将UI(View)与其数据(Model)分开。

在 SwiftUI 中使用任务的正确方法

我最近开始使用 SwiftUI 并构建了一个简单的应用程序来从 Web 服务获取数据。我的视图中有以下代码 结构ProductsView:查看{ @EnvironmentObject var

回答 1 投票 0

flutter go_router 出现 Riverpod 重定向异常/位置不能为空。 / 未通知重定向

我正在使用 Riverpod 作为状态管理来开发我的应用程序,并且我使用 go_router 包进行路由管理,专门用于将用户重定向到刷新令牌更新失败的登录页面。 所以

回答 1 投票 0

maui:当可观察集合中的项目更改其道具之一时,UI 不会更新,除非我离开并重新打开页面

我只是想捕获我的可观察集合中的一个项目并更改它的一个道具: 公共无效点击(对象obj) { Device.InvokeOnMainThreadAsync(() => { ...

回答 1 投票 0

在 mvvm 结构中处理继承相同基类的类

我在 .NET MAUI 应用程序中设置了 MVVM 结构。 我的模型的结构如下: 公共部分类动物 { 公共字符串名称{获取;放; } } 公开课鸟类:动物 {...

回答 1 投票 0

在 .NET MAUI 中进行课程注册和编辑的共享 XAML/ViewModel 方法

我正在开发具有 MVVM 结构的 .NET MAUI。我有一个显示课程列表的主页。单击课程时,我将课程对象从 startpage.cs 传递到 CourseDetailsViewModel。 不...

回答 1 投票 0

将视图模型传递到回收器视图适配器中会导致内存泄漏吗?

目前我正在试验视图模型,想知道将视图模型传递给 recyclerview 适配器是否会导致内存泄漏?适配器中视图模型的唯一目的是提供...

回答 1 投票 0

在 NET MAUI 中的 MVVM 命令中更改双参数时,显示中的双参数不会更新

我正在为产品商店制作客户端应用程序。购物车位于服务器上,数据通过对服务器的请求传输到那里。产品篮是

回答 1 投票 0

具有数据类的 LiveData 不会在 ViewModel 中更新

我想在我的 MainViewModel 中使用我的数据类 AuthData。 de.hsfl.appamigos.capturetheflag 包 导入 androidx.lifecycle.MutableLiveData 数据类 AuthData(var game: MutableLiveData 我想在我的 MainViewModel 中使用我的数据类 AuthData。 package de.hsfl.appamigos.capturetheflag import androidx.lifecycle.MutableLiveData data class AuthData(var game: MutableLiveData<String>) package de.hsfl.appamigos.capturetheflag import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel class MainViewModel : ViewModel() { private val authData: MutableLiveData<AuthData> = MutableLiveData() fun getGame(): LiveData<AuthData> = authData fun setGame(newAuthData: AuthData) { authData.value?.game = newAuthData.game } fun startNewGame(text: String) { val newGame = MutableLiveData("1234") val newAuthData = AuthData(newGame) setGame(newAuthData) } } 当我尝试观察我的片段之一的变化时,它没有得到通知。 package de.hsfl.appamigos.capturetheflag import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController import de.hsfl.appamigos.capturetheflag.databinding.FragmentLobbyBinding class LobbyFragment : Fragment() { ... val mainViewModel: MainViewModel by activityViewModels() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?, ): View? { // Inflate the layout for this fragment //val root = inflater.inflate(R.layout.fragment_lobby, container, false) val binding = FragmentLobbyBinding.inflate(inflater) val naviGraph = findNavController() mainViewModel.getGame().observe(viewLifecycleOwner) { binding.textViewGameID.text = it.game.toString() } ... return binding.root; //return inflater.inflate(R.layout.fragment_lobby, container, false) } } 我尝试取出数据类,只使用可变的,并且工作正常,所以所有连接都有点正确。 我想这是因为 authData 没有改变,但属性 game 改变了。如何观察属性本身的变化? 我无法解决数据类问题,因为这是我的教授的要求。我可以使用普通课程,但我看不出这有什么帮助。 我猜这是因为 authData 没有改变,但属性游戏改变了。 正是如此。 如何观察属性本身的变化? 观察属性本身。 mainViewModel.getGame().game.observe(viewLifecycleOwner) { binding.textViewGameID.text = it.game.toString() } 或者更新当前观察到的整个对象。 fun setGame(newAuthData: AuthData) { //authData.value?.game = newAuthData.game authData.value = newAuthData } 附注- 你的方法名称很混乱。获取并设置“游戏” 获取并设置一个“AuthData”,它本身有一个“游戏”?如果您要获取并设置“AuthData”,只需将其称为 getAuthData 和 setAuthData。 您在 LiveData 的数据类中有一个 LiveData。听起来不太对。 您的数据类应该只包含简单的类,即数字或字符串等,或其他数据类。此外,当从视图模型中公开时,您的数据类应该是不可变的,也就是说,它们只包含 val 属性。你的数据类应该看起来像这样: data class AuthData(val game: String) 使视图模型适应更改后的数据类,如下所示: class MainViewModel : ViewModel() { private val authData: MutableLiveData<AuthData> = MutableLiveData() fun getGame(): LiveData<AuthData> = authData private fun setGame(newAuthData: AuthData) { authData.value = newAuthData } fun startNewGame(text: String) { val newGame = "1234" val newAuthData = AuthData(newGame) setGame(newAuthData) } } 现在一切都应该正常了。

回答 2 投票 0

Kotlin Android 项目在 ViewModel 中使用数据类

我想在我的 MainViewModel 中使用我的数据类 AuthData。 de.hsfl.appamigos.capturetheflag 包 导入 androidx.lifecycle.MutableLiveData 数据类 AuthData(var game: MutableLiveData 我想在我的 MainViewModel 中使用我的数据类 AuthData。 package de.hsfl.appamigos.capturetheflag import androidx.lifecycle.MutableLiveData data class AuthData(var game: MutableLiveData<String>) package de.hsfl.appamigos.capturetheflag import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel class MainViewModel: ViewModel() { private val authData: MutableLiveData<AuthData> = MutableLiveData() fun getGame(): LiveData<AuthData> = authData fun setGame(newAuthData: AuthData) { authData.value?.game = newAuthData.game } fun startNewGame(text: String){ val newGame = MutableLiveData("1234") val newAuthData = AuthData(newGame) setGame(newAuthData) } } 当我尝试观察我的片段之一的变化时,它没有得到通知。 package de.hsfl.appamigos.capturetheflag import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController import de.hsfl.appamigos.capturetheflag.databinding.FragmentLobbyBinding class LobbyFragment : Fragment() { ... val mainViewModel: MainViewModel by activityViewModels() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment //val root = inflater.inflate(R.layout.fragment_lobby, container, false) val binding = FragmentLobbyBinding.inflate(inflater) val naviGraph = findNavController() mainViewModel.getGame().observe(viewLifecycleOwner) { binding.textViewGameID.text = it.game.toString() } ... return binding.root; //return inflater.inflate(R.layout.fragment_lobby, container, false) } } 我尝试取出数据类,只使用可变的,并且工作正常,所以它的所有连接都有点正确。 我想这是因为 authData 没有改变,但属性游戏改变了。如何观察属性本身的变化? 我无法解决数据类问题,因为这是我的教授要求的,我可以使用普通类,但我看不出这有什么帮助。 我猜这是因为 authData 没有改变,但属性游戏改变了。 正是如此。 如何观察属性本身的变化? 观察属性本身。 mainViewModel.getGame().game.observe(viewLifecycleOwner) { binding.textViewGameID.text = it.game.toString() } 或者更新当前观察到的整个对象。 fun setGame(newAuthData: AuthData) { //authData.value?.game = newAuthData.game authData.value = newAuthData } 附注- 你的方法名称很混乱。获取并设置“游戏” 获取并设置一个“AuthData”,它本身有一个“游戏”?如果您要获取并设置“AuthData”,只需将其称为 getAuthData 和 setAuthData。

回答 1 投票 0

如何在 MVVM WPF 模式中执行关闭、隐藏窗口等命令或启动进程的命令

我正在 WPF 平台上使用 MVVM 模式开发应用程序,但我不知道如何使用与 ViewModel 中的视图直接相关的命令,这样就不会破坏

回答 1 投票 0

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);行,它完美地工作了。

回答 1 投票 0

我应该在 ViewModel 中包含 LifecycleOwner 吗?

当前需要 LifecycleOwner 才能创建观察者。 我有在 ViewModel 中创建观察者的代码,因此在我的

回答 4 投票 0

WPF DataGrid - RowDetails DataContext

背景 我有以下 DataGrid,其中有两列用于描述和状态。它们绑定到一个名为 RowViewModels 的 ObservableCollection ,它作为 ...

回答 1 投票 0

WPF MVVM 带参数的数据绑定?

所以我之前的问题似乎无法回答,所以我将根据自己的建议尝试一下。 我正在寻找的功能是让数据网格改变前景(甚至

回答 2 投票 0

在MVVM下处理WPF中的“X”关闭按钮

我正在 WPF 中创建一个基本的数据库应用程序,并且我已经开始使用 MVVM 模式。 我有一个对话框,要求用户从列表框中选择一个项目,然后单击“确定”。之后,我...

回答 3 投票 0

学习 WPF 和 MVVM - 从头开始学习的最佳方法[已关闭]

我有大约三年的 c# 经验。我想学习一些 WPF 和 MVVM 模式。 该网站上有很多文章的链接,但我有点不知所措。 明智的

回答 8 投票 0

将文本框绑定到字符串变量

我真的很难让文本框绑定到字符串变量,并且在互联网上尝试了各种解决方案,但没有成功。也许有人可以指出我做错了什么? 嗯...

回答 1 投票 0

在 .NET MAUI 项目中切换录制动画时出现崩溃问题

“我目前正在开发一个 .NET MAUI 项目。假设用户可以使用同一个按钮开始和停止录制。我希望在录制时有连续的动画,并且当按钮...

回答 1 投票 0

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。

回答 1 投票 0

从设置返回应用程序后如何正确检查位置服务是否已打开

我有一个应用程序,它应该在启动时检查位置服务是否打开或关闭。我尝试使用 AlerDialog,并通过 Intent 将用户发送到设置,但它不起作用......

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.