Model-View-ViewModel(MVVM)是一种架构设计模式,用于实现用户界面,通过其表示逻辑(其ViewModel)将UI(View)与其数据(Model)分开。
WPF 初学者这里可能是一个非常简单的问题。是否可以选择多行并选中所有选定的复选框? 我想检查选定的 S601 和 S701 盒子...
为什么我的 SwiftUI 视图无法从 @StateObject 的 @Binding 成员获取 onChange 更新?
鉴于我在下面概述的设置,我试图确定为什么 ChildView 的 .onChange(of: _) 没有接收更新。 导入 SwiftUI struct SomeItem: Equatable { var double 值: 双精度 } 是...
使用 MVVM 将新元素添加到 WPF 中 DataGrid 中的 ComboBox
我有一个包含事务的数据网格。我有一个 InterestOrDividend 列,我可以在其中使用组合框选择一个值。这很好用。 一个新功能是输入一个值并添加它......
我正在使用 MVVM 模式对项目进行少量添加。 该项目有点大,但我将其精简为一个很小的示例项目,以使这里的工作变得更容易。 代码 忙碌查看模式...
我正在设计一个主/详细视图模型方案,因此我创建了一个基类,该基类实现“添加”、“编辑”、“保存”、“取消”和“删除”命令,并管理这些命令的 CanExecute 逻辑。豪...
向视图添加一个按钮,使用 Community Toolkit 和 MVVM 将用户重新路由到 Avalonia 中的另一个视图
我刚刚开始学习 Avalonia,我想知道如何创建一个按钮,将我从一个视图重新路由到另一个视图。 我有第一个视图,标题为 ValueSelectionPageView,我想向其添加一个按钮
ObservableCollections vs ObservableObject vs ObservableRecipient vs ViewmodelBase?
我是 avaloniaUI 和 MVVM 社区工具包的初学者。 现在,我正在制作一个 KanbanBoard Windows 应用程序并编写 ViewModel 代码。 我在他们的 github 中红色了 SimpleToDoList。然而我无法理解这些
CommunityToolKit Mvvm 8.2.2 如何将 Integer 注册为 TMessage
我正在尝试将整数注册为 TMessage 但似乎不可能。如果我没记错的话,在 MVVMLightLibs 中是可能的。 这是给出错误的代码 int 最后Recie...
.NET MAUI实时检测当前CultureInfo是否发生变化?
我按照 Geralt 的 YouTube 视频中有关 .NET MAUI 上的多语言的教程进行操作,非常好且非常详细:https://www.youtube.com/watch?v=cf4sXULR7os 经过多次谷歌搜索结果...
我是 mvvm 的新手(当然还有 mvvlight)。我有 3 个模型视图(一个带有容器的主窗口,另外 2 个模型视图(登录和菜单))。在 LoginModelView 中,当用户登录时
我是 C# 和 WPF 的新手,老实说这周才开始自学。我正在尝试制作一个突出显示红色的下拉菜单(表示此字段是必需的),直到选择一个项目...
我正在尝试实现一个 DataGrid,其中一列有一个复杂的对象,而组合框(网格外)有一个该列的同一时间对象的列表。使用 WPF 和 MVVM。 当我...
我正在编写一个程序,该程序读取 cmd 脚本输出并在日志(视图模型)中显示结果。由于脚本运行了很长时间,我希望能够在每行写入后看到输出...
单独的 DataGrid 绑定到同一个 Observable 集合
我有一个带有 TabControl 的 WPF 应用程序,在两个不同的 TabItem 上,我想在每个 TabItem 上的 DataGrid 中显示相同的内容。 操作顺序如下: 用户选择信号或...
UserControl 未在 WPF ContentControl 中呈现
我是 WPF 和 MVVM 的新手。我花了两天时间浏览了一堆关于这个主题的问答,但我还没有成功地让它发挥作用。这不可避免地意味着这是愚蠢的事情......
我在设计可扩展程序的架构时遇到了一些问题。 我正在使用 MEF、MMVM Light Toolkit 和 AvalonDock。 第一个问题是如何显示某些 ViewModel 的视图
CollectionViewSource.SortDescriptions 仅适用于基础 ObservableCollection 的第一个第一个群体
我有一个带有 CollectionViewSource 设置如下的网格: 我有一个 Grid,其 CollectionViewSource 设置如下: <UserControl.Resources> <CollectionViewSource x:Key="PriceHistoryItemsViewSource" Source="{Binding PriceHistory}" IsLiveSortingRequested="True"> <CollectionViewSource.SortDescriptions> <componentModel:SortDescription PropertyName="Inserted" Direction="Descending"/> </CollectionViewSource.SortDescriptions> </CollectionViewSource> </UserControl.Resources> <DataGrid Style="{StaticResource HistoryGrid}" ItemsSource="{Binding Source={StaticResource PriceHistoryItemsViewSource}}"> <DataGrid.Columns> ///... </DataGrid.Columns> </DataGrid> 在 ViewModel 中,PriceHistory 是由 ObservableCollection 更新的 RefreshPriceHistoryAsync,如下所示: public class OptionPriceHistoryViewModel : PriceHistoryViewModel { //... other code public ObservableCollection<OptionPriceHistoryRecordViewModel> PriceHistory { get; } = new(); public override async Task RefreshPriceHistoryAsync(string correlationId) { var priceHistory = await _historyProvider.GetOptionPriceHistoryAsync(id); PriceHistory.Clear(); foreach (var priceHistoryRecord in priceHistory) PriceHistory.Add(new OptionPriceHistoryRecordViewModel( priceHistoryRecord.InsertDate, priceHistoryRecord.Username //... etc. )); } } 此 ViewModel 用作 Window 控件中的 DataContext。 可以重复使用同一窗口来显示各种实体的价格历史记录。 排序仅在第一次填充 PriceHistory 时有效。如果重复使用同一个窗口来显示各种实体的历史记录,则在第一个之后的所有调用中都会忽略排序(即,项目按照它们来自数据库的顺序显示)。 如何在重用窗口时保留排序? 坦率地说,我不明白为什么它不起作用,因为每次重用窗口时,都会创建 OptionPriceHistoryViewModel 的新实例......并且项目的绑定有效,但排序不起作用。 您还需要设置 LiveSortingProperties 属性: <CollectionViewSource x:Key="PriceHistoryItemsViewSource" Source="{Binding PriceHistory}" IsLiveSortingRequested="True"> <CollectionViewSource.SortDescriptions> <componentModel:SortDescription PropertyName="Inserted" Direction="Descending"/> </CollectionViewSource.SortDescriptions> <CollectionViewSource.LiveSortingProperties> <s:String>Inserted</s:String> </CollectionViewSource.LiveSortingProperties> </CollectionViewSource> 这里有一些关于此的链接: 我需要 CollectionViewSource 排序/实时排序说明 https://www.codeproject.com/Questions/326899/CollectionViewSource-not-sorting
我正在学习 xamarin 形式和 mvvm 模式。我想知道是否可以否定绑定布尔值。我的意思是: 我有,比方说带有 isVisible 绑定的 Entry: 我正在学习 xamarin 形式和 mvvm 模式。我想知道是否可以否定绑定布尔值。我的意思是: 我有,比方说,带有 isVisible 绑定的条目: <Entry x:Name="TextEntry" IsVisible="{Binding IsVisibleEntry}" /> 和 Label 当 TextEntry 可见时我想隐藏它们。 <!-- ofc it is not working --> <Label x:Name="MainLabel" isVisible="!{Binding IsVisibleEntry}" /> 是否可以在 MainLabel 中不为 ViewModel 创建新变量? 选项一:转换器 定义转换器: public class InverseBoolConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return !((bool)value); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return value; //throw new NotImplementedException(); } } XAML 中的用法: <Label x:Name="MainLabel" isVisible="{Binding IsVisibleEntry, Converter={Helpers:InverseBoolConverter}}"/> XAML 标头 xmlns:Helpers="clr-namespace:HikePOS.Helpers" 选项二:触发 <Label x:Name="MainLabel" isVisible="{Binding IsVisibleEntry}"> <Label.Triggers> <DataTrigger TargetType="Label" Binding="{Binding IsVisibleEntry}" Value="True"> <Setter Property="IsVisible" Value="False" /> </DataTrigger> </Label.Triggers> </Label> 您可以使用 Xamarin Community Toolkit,而不是编写自己的转换器,它现在有一个可以开箱即用的转换器 invertedboolconverter。这个例子(取自微软的文档)展示了它是如何工作的: <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:xct="http://xamarin.com/schemas/2020/toolkit" x:Class="MyLittleApp.MainPage"> <ContentPage.Resources> <ResourceDictionary> <xct:InvertedBoolConverter x:Key="InvertedBoolConverter" /> </ResourceDictionary> </ContentPage.Resources> <StackLayout> <Label IsVisible="{Binding MyBooleanValue, Converter={StaticResource InvertedBoolConverter}}" /> </StackLayout> </ContentPage> 您将需要创建一个反向转换器,以便您的绑定看起来有点像这样: public class InverseBoolConverter : IValueConverter { public object Convert (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return !(bool)value; } public object ConvertBack (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return !(bool)value; } } 在您的 XAML 中 <local:InverseBoolConverter x:Key="inverter"/> <Entry x:Name="TextEntry" IsVisible="{Binding IsVisibleEntry, Converter={StaticResource inverter}}" /> 尽管@praty 的解决方案有效,但如果您像我一样使用自定义控件/视图或 XCT 的弹出窗口。在我们的 XAML 中使用转换器之前,我们需要这样指定: <ContentView.Resources> <converters:InverseBoolConverter x:Key="invrerseBoolConverter" /> </ContentView.Resources> 因此最终代码将是: InverseBoolConverter.cs // Under namespace MyProject.Converters public class InverseBoolConverter : IValueConverter { public object Convert (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return !(bool)value; } public object ConvertBack (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return !(bool)value; } } XAML 代码 <xct:Popup ... xmlns:xct="http://xamarin.com/schemas/2020/toolkit" xmlns:converters="clr-namespace:MyProject.Converters" ...> <ContentView> <ContentView.Resources> <converters:InverseBoolConverter x:Key="inverseBoolConverter" /> </ContentView.Resources> <StackLayout> <Label IsVisible="{Binding IsVisibleLabel, Converter={StaticResource inverseBoolConverter}}" /> </StackLayout> </ContentView> </xct:Popup> 注意:虽然我们可以使用 Xamarin 社区工具包的 InvertedBoolConverter,但我已经描述了手动解决方案,以便我们可以添加除内置转换器之外的自定义值转换器。 我喜欢已经提供的答案,但我想我应该添加我自己有时使用的版本。在 MVVM 架构中,视图模型的属性都在对象设置器中调用 SetProperty(),从而引发 INotifyPropertyChanged 事件。我一直在做的是将第二个属性添加到视图模型中,并在第一个属性的设置器中将其值设置为 !value。 例如,每当属性 button.IsEnabled = false 出现时,我希望按钮为 ViewModel.IsBusy = true。这是一个反向布尔示例,就像您所问的那样。 ViewModel.cs 属性: private bool enableButton; public bool EnableButton { get { return enableButton; } set { SetProperty(ref enableButton, value); } } private bool isBusy; bool IsBusy { get { return isBusy; } set { SetProperty(ref isBusy, value); EnableButton = !value; } } XAML: <ActivityIndicator IsRunning="{Binding IsBusy}"/> <Button Text="Start Sync" Command="{Binding SyncCommand}" IsEnabled="{Binding EnableButton}"/> 这样,在我的代码中任何时候我调用IsBusy = true,它都会同时设置button.IsEnabled = false,解决反向布尔问题。
我的团队需要 ViewModel 的接口。我喜欢 MVVM 社区工具包,但我想同时使用接口和 [RelayCommand] 属性类方法。 如何定义
我在 WPF 中有一个带有自动生成列的 DataGrid。 如何禁用遵循 MVVM 模式的所有行的排序功能? 我在 WPF 中有一个带有 自动生成 列的 DataGrid。 如何禁用遵循 MVVM 模式的所有行的排序功能? <DataGrid AutoGenerateColumns="True" ItemsSource="{Binding MyList}"> </DataGrid> 在 dataGrid 上设置 CanUserSortColumns="False",这将禁用所有列的排序。 <DataGrid AutoGenerateColumns="True" ItemsSource="{Binding MyList}" CanUserSortColumns="False"> </DataGrid>