Model-View-ViewModel(MVVM)是一种架构设计模式,用于实现用户界面,通过其表示逻辑(其ViewModel)将UI(View)与其数据(Model)分开。
我正在学习 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>
将 CommunityToolkit.MVVM 与 Visual Studio 扩展一起使用时出现构建错误
尽管 SourceGenerator 显然工作正常,但我还是遇到了构建错误。示例代码: 命名空间 VisGit.ViewModels { 公共部分类 MainViewModel: ObservableObject { ...
如何从RecyclerViewAdapter调用ViewModel.delete?
我想从 Recyclerview 适配器调用 ViewModel.delete(房间数据库)方法,但它不起作用。有任何想法吗? 我想在 OnBindViewHolder 中调用 ViewModel,如下所示: 持有人.绑定。
我有一个相当简单的组件,如下所示: 示例文本 ... 我有一个相当简单的组件,如下所示: <form> <div class="form-group"> <label for="sampleText">Sample Text</label> <input type="text" class="form-control" id="sampleText" aria-describedby="sampleTextHelp" placeholder="Enter a text" @bind="@Value" /> <small id="sampleTextHelp" class="form-text text-muted">Enter a text to test the databinding</small> </div> </form> <p>You entered here: @Value</p> @code { [Parameter] public string Value { get; set; } } 我现在将其添加到这样的页面中: <MVVMTest Value="@_value" /> <p> You entered in MVVMTest: @_value </p> @functions { private string _value; } 当我在输入字段中输入文本时,它会在 您在此处输入: 正确更新,但不会传播到 *您在 MVVMTest 中输入”: 我需要做什么才能正确传播它? 我可以考虑将一个 Action<string> 作为第二个 [Parameter] ,当文本更改时我会在组件内触发它,但这似乎是一种黑客和迂回的方式。是必须这样做吗,还是有更好的方法? 后续1 Issac 的答案不起作用,因为它用 @bind-value:oninput="@((e) => ValueChanged.Invoke(e.Value))" 绊倒了 Cannot convert lambda expression to type 'object' because it is not a delegate type。 我不得不用这种迂回的方式来做: <form> <div class="form-group"> <label for="sampleText">Sample Text</label> <input type="text" class="form-control" id="sampleText" aria-describedby="sampleTextHelp" placeholder="Enter a text" @bind="@Value" /> <small id="sampleTextHelp" class="form-text text-muted">Enter a text to test the databinding</small> </div> </form> <p>You entered here: @Value</p> @code { private string _value; [Parameter] public string Value { get => _value; set { if(Equals(value, _value)) { return; } _value = value; OnValueChanged.InvokeAsync(value).GetAwaiter().GetResult(); } } [Parameter] public EventCallback<string> OnValueChanged { get; set; } } 并像这样使用它: @inject HttpClient http @page "/test" <div class="top-row px-4"> Test Page </div> <div class="content px-4"> <MVVMTest Value="@_value" OnValueChanged="@(v => _value = v)" /> <p> You entered in MVVMTest: @_value </p> </div> @functions { private string _value; } 不漂亮,但有效。我的“真实”组件更加复杂,因为更改的值会触发对底层 ASP.net Core 服务的调用,因此我必须仔细检测谁更改了内容以避免无限循环。 如果 Blazor 支持类似 XAML/WPF 的 MVVM,那肯定会更好...... 后续2 我回到 Issac 的解决方案,并通过额外的演员,我让它工作了: <form> <div class="form-group"> <label for="sampleText">Sample Text</label> <input type="text" class="form-control" id="sampleText" aria-describedby="sampleTextHelp" placeholder="Enter a text" value="@Value" oninput="@((Func<ChangeEventArgs, Task>)(async e => await OnValueChanged.InvokeAsync(e.Value as string)))" /> <small id="sampleTextHelp" class="form-text text-muted">Enter a text to test the databinding</small> </div> </form> <p>You entered here: @Value</p> @code { private string _value; [Parameter] public string Value { get; set; } [Parameter] public EventCallback<string> OnValueChanged { get; set; } } 用途: <MVVMTest Value="@_value" OnValueChanged="@(v => _value = v)" /> <p> You entered in MVVMTest: @_value </p> @functions { private string _value; } 这已经是 Blazor 中的一个已知问题。上周我已经被这个问题绊倒了,我也在 VS 开发者论坛发布了解决方法。 您需要添加一个 EventCallback 参数来执行此操作: @code { [Parameter] public string Value { get; set; } [Parameter] public EventCallback<string> ValueChanged { get; set; } } 阅读与组件参数绑定部分。
我一直在开发一个 3 级的基本贪吃蛇游戏。其中前两个工作完全正常,但第三个却造成了麻烦。尽管除了一项额外功能之外所有代码都是相同的...
即使没有显式的 DataContext,为什么我的 View 仍然成功绑定到我的 ViewModel
我正在 WinUI3 中编写 MVVM 应用程序,并且遇到了我不理解的行为。目前我的主视图托管一个 NavigationView 控件。该控件包含一个 Frame 控件,它是
java.lang.IllegalStateException:读取在拍摄快照后或尚未应用的快照中创建的状态
我正在使用 kotlin 和 jetpack compose 开发一个非常基本的贪吃蛇游戏。为了提高效率,我想到了使用协程,但我不断收到上述错误。 完整的项目正在...
我是 MVVMCross(以及一般的 MVVM)新手。在开始编码之前,我需要一些架构建议。 我正在移植几个遗留应用程序。它们共享大量的业务逻辑。我当时...
我正在尝试为 Android 构建一个基本的贪吃蛇游戏。除了食物更新之外,一切都运转良好。它是随机工作的,有时,当你从食物旁边经过时,它会变得
在 Flow 上从 .first() 切换到 .collect{} 会停止数据出现在屏幕上
我使用 Flow 和 Room 制作了一个视图模型,使用 .first() 将 UiState 上的变量与 Room 连接起来,正如代码实验室向我展示的那样。我注意到使用 .first() 不是一个好主意,因为当我
MVVM 中的 ICollectionView 和 CollectionViewSource
我正在学习 .NET 和 WPF,同时构建一个小型待办事项列表(如应用程序)。 我试图了解 ICollectionView 接口和 CollectionViewSource 如何与 MVVM 模式一起使用,...
我一直在关注如何使用 MVVM 制作第一个应用程序的教程,但我无法将 ViewModel 绑定到 MainWindow,然后从屏幕上获取数据。我得到 2 行空.. .
我有一个场景,我希望能够在 UI 中收集字符串数组...视图模型不应该关心如何收集字符串...并将该字符串数组传递给视图模型.. .
我有一个 WPF 窗口,其网格包含 4 个矩形。其中之一有一个用于显示页面的 ,在我的应用程序中使用。我想向窗口上的这些按钮添加命令...
当您选择房间时,RoomId 会传递到另一个窗口,该窗口根据 RoomId 显示任务。 我选择一个房间,转到另一个窗口,但没有显示任务 + 我尝试添加任务,...
将 ListBox 项目转换回其 Collection 类型
在我的 XAML 中,我有两个选项卡,第一个包含绑定到 ObservableCollection 对象的 ListBox,称为 ParameterFilesList,第二个包含绑定到 ObservableCollection 对象的 ListBox,称为
从 ViewModel 更改时,Datagrid 将不会更新
我有一个 DataGrid,其 ItemsSource 绑定到 DataTable。当我更新 DataTable 时,ViewModel 中的数据会更新,但 UI 不会更新。我已经在我的 Vie 中使用了 INotifyPropertyChanged...
我想知道如何在我的解决方案中实现干净的架构。我有项目:核心(模型、消息、ViewModels)、移动(毛伊岛项目 - >视图)、共享(Dto 项目)。我有: <