在 MVVM 中设置可见性的最佳方法

2024-05-15

In my View我有三个对象,其中一个在任何给定时间都是可见的。在我的Model我有一个枚举来代表这三个状态。

我应该如何实施我的ViewModel?

a) 为每个对象的可见性创建一个布尔值,并将每个对象绑定到该布尔值(使用 bool->visibility 转换器)。

b) 绑定到枚举,每个对象都有一个唯一的转换器。

c) 使用带有参数的单个转换器绑定到枚举。

d) 使用具有布尔关键帧的视觉状态管理器,并通过附加属性从 VM 驱动状态。

e) 从代码隐藏绑定到 VM 枚举,并通过代码设置可见性。

f) ?

我真心希望答案是 f)(即我没有想到的明显选择),因为我对 a) 到 e) 并没有真正感到欣喜若狂。

欢迎和赞赏的想法。


MVVM 中的最佳方法并不一定意味着easy。我喜欢以下方法:

a) 为每个对象的可见性创建一个布尔值,并将每个对象绑定到该布尔值(使用 bool->visibility 转换器)。

此方法是设置 Visibility 的最直观、最经典的方法Control.

b) 绑定到枚举,每个对象都有一个唯一的转换器。

c) 使用带有参数的单个转换器绑定到枚举。

对于转换器来说,Enum最好不要在Model并在旁边View。因为问题解决到了视图一侧,这是非常合乎逻辑的,在这里存储数据结构。原则上,这并不重要。

Example:

public sealed class InvertableBooleanToVisibilityConverter : IValueConverter
{
    enum Parameters
    {
        Normal, 
        Inverted
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var boolValue = (bool)value;
        var direction = (Parameters)Enum.Parse(typeof(Parameters), (string)parameter);

        if (direction == Parameters.Inverted)
            return !boolValue ? Visibility.Visible : Visibility.Collapsed;

        return boolValue ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return DependencyProperty.UnsetValue;
    }
}

关于其他方法的一些评论:

d) 使用具有布尔关键帧的视觉状态管理器,并通过附加属性从 VM 驱动状态。

对于这些情况,看起来很复杂,所以看不到其中的意义。但是,如果设置Visibility的条件并不困难,你可以使用VisualStateManager.

e) 从代码隐藏绑定到 VM 枚举,并通过代码设置可见性。

当您可以使用 MVVM 的典型工具(绑定、转换器等)解决问题时,这种情况下的代码隐藏是不合理的。我认为,在这种情况下,如果选择元素到Visibility不涉及业务逻辑,比如可以通过按来设置可见性CheckBox, ToggleButton, etc.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 MVVM 中设置可见性的最佳方法 的相关文章

  • OpenGL:顶点越多,性能越慢

    我正在开发一个程序的一部分 其中给定 xyz 坐标集合 制作 3D 模型 我已经完成了这张图片所需的所有功能 即平移 旋转 缩放 但是给出的 xyz 坐标越多 程序运行速度就越慢 我的程序在处理 29 000 个坐标时运行得非常流畅 但当我
  • WPF 简单绑定到对象属性

    我在 wpf xaml 中绑定时遇到一些问题 有这个简单的文件
  • 当 DataTable 为空时,DataGrid 显示空行

    我有一个DataGrid dg1 绑定到DataTable 数据集 表 代码运行良好并且DataGrid正在显示数据DataTable正确 但是 如果我Clear the DataTable the DataGrid也很清楚 但留下一个空行
  • 在 WPF 媒体元素中连续重播视频

    我有一个在媒体元素中播放的视频文件 我需要继续播放 因此我尝试了 me play me MediaEnded new RoutedEventHandler me MediaEnded 使用此事件方法 loop to keep video p
  • 将快速文本输入发送到另一个进程(窗口)

    我正在编写一个 C WPF 程序 它将文本消息发送到另一个程序的窗口 我有一个宏程序作为我的键盘驱动程序 Logitech g15 的一部分 它已经做到了这一点 尽管它不会将击键直接发送到进程 而是发送到当前聚焦的窗口 它运行良好 但我也需
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • 已发布的 .Net Core 应用程序警告安装 .Net Core,但它已安装

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • 为什么在 Windows 中缩放 WPF 应用程序时会看到像素?

    我使用 WPF 为随机应用程序开发了一个 GUI 我在应用程序窗口上放置了一堆开箱即用的 WPF 控件 我没有定制任何东西 没有使用位图等 在 Windows 7 中运行我的应用程序并使用放大镜应用程序进行缩放时 Win key Plus
  • WPF:鼠标按下时不会触发鼠标离开事件

    我遇到鼠标进入 离开事件的问题 当按下鼠标按钮并按住光标在控件内 然后光标以足够快的速度移出控件时 此事件不会触发 你能告诉我为什么会这样吗 有什么方法可以正确获取这些事件吗 请检查示例项目以查看其实际效果 https www dropbo
  • 如何将 listviewitem 中的按钮绑定到 Winrt 中 ViewModel 中的命令

    我有一个导航到帐户命令ViewModel 中的 RelayCommand 属性 当我将其绑定到 ListView 之外任何地方的页面上的按钮时 命令绑定正在工作 但是 一旦我将其移至 ListView 的 DataTemplate 它就不起
  • WPF DataGrid 选定项

    我有一个 DataGrid 用户可以通过在最后一行输入数据来添加项目 我还有一个按钮可以删除当前选定的项目 但是 当选择最后一行 空 用于添加新项目 时 最后选定的项目将保留在 SelectedItem 中 因此 如果我打开窗口 选择最后一
  • 在表格中可视化 2D 数据

    我需要一些帮助并且需要指出正确的方向 我正在创建一个应显示二维数据的 WPF 应用程序 它应该显示如下 y x 1 2 3 4 5 1 1 2 3 4 5 2 2 4 6 8 10 3 3 6 9 12 15 4 4 8 12 16 20
  • WPF 日历控件按住鼠标

    所以我放弃了标准的 WPFCalendarVS2010 中全新 WPF 应用程序中的 MainWindow xaml 控件 如果我单击日历中的某一天 然后尝试单击应用程序的 关闭 按钮 则我必须在关闭按钮上单击两次才能接受单击 它的表现就好
  • 在 XAML 中设置依赖项属性时,为什么会在运行时绕过 .NET 属性包装器?

    我正在阅读 Adam Nathan 的书 WPF 4 Unleashed 第 82 页有以下警告 在 XAML 中设置依赖属性时 NET 属性包装器会在运行时被绕过 虽然 XAML 编译器依赖于 编译时的属性包装器 WPF 调用底层 直接在
  • 将 ARGB 拆分为字节值

    我有一个 ARGB 值存储为 int 类型 它是通过调用 ToArgb 来存储的 我现在想要来自 int 值的各个颜色通道的字节值 例如 int mycolor 16744448 byte r g b a GetBytesFromColor
  • 使用 WPF 动态加载内容

    好的 我有一个容器 我为其创建了两个数据模板 基本上 一个模板将显示 5 个文本框 其中包含绑定到它们的对象数据 另一个模板将显示一个用于添加该特定对象的按钮 我对 DataTemplateSelector 进行了子类化 它可以工作 但是当
  • WPF 自定义控件 - ItemsControl 模板未应用

    我正在构建一个派生自 TabControl 的自定义 WPF 控件 在 ControlTemplate 中 我使用 ItemsControl 来显示从模板绑定的列表 FileMenuItem 类型的可观察集合 在程序执行期间 我在输出窗口中
  • WPF 从主线程以外的其他线程截屏

    我有一个线程用于侦听 WPF 应用程序的命令 如果 WPF 应用程序收到截取屏幕截图的命令 则任务将移交给 screenshotService 我在互联网上的某个地方找到了一些代码来截取屏幕截图 似乎可以工作 但我还没有想清楚 我无法从另一
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时

随机推荐