Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ViewModel中可见性类型的属性_C#_Wpf_Xaml_Mvvm - Fatal编程技术网

C# ViewModel中可见性类型的属性

C# ViewModel中可见性类型的属性,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,在WPF应用程序中,当需要从ViewModel触发视图元素的可见性时,基本上有两种方法: 方法1:使用bool 视图: 视图: 问题 “方法2”仍然符合MVVM吗 我什么时候应该使用“方法1” 编辑:将问题更改为不太基于意见。我认为这实际上取决于您将如何处理该属性。应用程序的某些视图可能只是使图像可见/不可见,但在创建另一个视图时,可能需要根据图像的可用性显示一个全新的模板 在这种情况下,Visibility属性会有点奇怪。第二个选项将ViewModel绑定到特定的技术(WPF)。另一种技术

在WPF应用程序中,当需要从ViewModel触发视图元素的可见性时,基本上有两种方法:

方法1:使用
bool
视图:

视图:


问题
  • “方法2”仍然符合MVVM吗

  • 我什么时候应该使用“方法1”


  • 编辑:将问题更改为不太基于意见。

    我认为这实际上取决于您将如何处理该属性。应用程序的某些视图可能只是使图像可见/不可见,但在创建另一个视图时,可能需要根据图像的可用性显示一个全新的模板


    在这种情况下,Visibility属性会有点奇怪。

    第二个选项将ViewModel绑定到特定的技术(WPF)。另一种技术,如某些web框架,将具有不同的可见性枚举。您可能还需要将WPF引用添加到您的模型项目中,这对于某些场景来说可能不是一个好主意(因为该项目的所有使用者现在也必须包括该引用)


    如果ViewModel中不需要跨框架兼容性,则可以使用第二个,而不存在任何其他缺点。

    考虑以下情况:


    做出以下界面设计决策:图像将被设置为%10不透明,而不是隐藏图像,就像幽灵一样。现在,如果选择第二个选项,则必须更改viewmodel代码,因为界面设计发生了更改。但是,如果您选择了第一个选项,那么您可以修改接口(可能添加booltopacity转换器)以反映该更改。第一种选择更符合MVVM的理念。如果您有独立的人员处理界面设计和viewmodel代码,那么他们就不必相互干涉工作。

    这个问题基于太多的观点,因此无法在此讨论。我会在代码审查网站上尝试。无论如何,IMO:1)因为严格地说,它更像MVVM。2) 是的,它打破了它,但我不认为这是一个问题,我认为我们必须有点灵活,他们是指导方针,而不是规则。3) 不。@Adriano:为什么它打破了关注点的分离?这两种方法最终都会做完全相同的事情。你是否认为第一个方法也打破了关注的分离?最后一点是你暴露了一个特定于EnUM的WPF。如果你打算把你的用户界面移植到,比方说,网络上,那么这将打破它。如果你认为你永远不会将你的应用程序移植到另一个平台,那么你可以很高兴地使用它(坦白地说,无论如何……可能你必须重写模型中不多的属性)。无论如何,我写了太多的评论……我要指出另一件事。这里我们讨论的是,对于该属性,枚举还是布尔值更好。我认为我们应该考虑真正的问题:那个属性的名字(然后是它的意思)。若您将其命名为“可见”,那个么您将向模型中添加一个UI细节(可见性)。模型应具有与域相关的属性(已删除?不可访问?用户隐藏?)。若你们用领域词汇和概念来描述模型,那个么你们甚至不会想到可见性。我很高兴你们发表最后的评论。当我问“你是否认为第一种方法也打破了关注的分离”时,我在想。我真的很担心,如果一开始就暴露出
    IsVisible
    ,可能会把整个事情搞错。非常感谢您的评论。
    Visibility
    确实链接到了WPF。但很可能您已经在ViewModel中使用了WPF内容,如
    ICommand
    Dispatcher
    。错误。ICommand或Dispatcher是Windows命名空间的类,与WPF无关。
    Visibility
    PresentationCore.dll
    WindowsBase.dll
    中定义。我从未见过任何项目只引用这两个DLL中的一个。@BenoitBlanchon这不仅仅是它们的定义点。ICommand可以在任何地方使用(现在它已被移动到System.dll),但不能在域中使用。ICommand仅限于WPF域,但可见性是。在大多数情况下,您只想使控件可见或不可见。。。但是你是对的,
    bool
    打开了更多的可能性。这种灵活性真的值得牺牲XAML的清晰度吗?另外,根据我的经验,视图中的更改通常需要更改ViewModel;所以我认为,这是一个可以接受的缺点。嗯,这是一个偏好的问题。我个人认为XAML的清晰度根本没有降低。(顺便说一句,您可以尝试将转换器放置在共享资源中,以稍微清理XAML)。但是,如果您认为这是一个可以接受的缺点,那么MVVM可能毕竟不是适合您的模式。考虑这一点:在许多MVVM框外框架中存在布尔可见性转换器,表明第一种方法更适合MVVM。但是,<代码> BooleanToVisibilityConverter <代码>非常有限:它永远不会返回<代码>可见性。隐藏< /代码>。如果需要,您需要编写自己的转换器,或者添加
    触发器。所有这些都可以通过ViewModel中的
    可见性来避免。+1我认为这是避免模型中可见性的最佳点。较长或较短的代码(最佳实践很少较短…)实际上并不比意图更重要(如果您不关心这一点,就不要使用MVVM)@BenoitBlanchon假设您正在显示一个图像列表,则标志可能只是“删除”(布尔值)。第一个版本不显示已删除的图像,第二个版本添加标志以显示它们(静音)。在这种情况下,您还需要更改模型的名称、类型和行为。。。
    
    class ViewModel
    {
        public bool IsMyImageVisible { get; set; }
    }
    
    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="booleanToVisibility" />
    </Window.Resources>
    
    <Image Visibility="{Binding IsMyImageVisible, Converter={StaticResource booleanToVisibility}}" />
    
    class ViewModel
    {
        public Visibility MyImageVisibility { get; set; }
    }
    
    <Image Visibility="{Binding MyImageVisibility}" />