XAML UserControls应该公开任意属性还是只公开ViewModel?

nafvub8i  于 2023-03-27  发布在  其他
关注(0)|答案(1)|浏览(100)

当我为WinUI 3或UWP设计一个很酷的新UserControl时,我应该更喜欢创建一个具有许多属性的控件,还是一个直接绑定到ViewModel的控件?

示例

为了便于讨论,让我们从Material UI中选取这张基本卡片:

我应该选择:

方法1:暴露许多属性

<!-- Many properties -->
<Card
    Subtitle="Word of the Day"
    Title="Be*nev*o*lent"
    LowerSubtitle="adjective"
    Description="well meaning and kindly. 'a benevolent smile'"
    LinkText="Learn more"
    LinkUri="http://example.com" />

方法2:仅显示ViewModel

x一个一个一个一个x一个一个二个x

背景

在C++/WinRT指南XAML controls; bind to a C++/WinRT property(将C++/WinRT与XAML一起使用的官方介绍)中,您最终将一些数据直接绑定到ViewModel:

<!-- MainPage.xaml -->
<Button Click="ClickHandler" Content="{x:Bind MainViewModel.BookSku.Title, Mode=OneWay}"/>

它甚至写道(在比较ViewModel和Models的上下文中,强调了这一点):
视图模型是视图的抽象,因此它直接绑定到视图(XAML标记)。**数据模型是数据的抽象,它只从视图模型中使用,而不直接绑定到XAML。因此,您可以将数据模型声明为C++结构或类,而不是运行时类。它们不需要在MIDL中声明,你可以自由使用任何你喜欢的继承层次结构。
我不清楚这是在说“ViewModels和View代码隐藏应该绑定到View,而不是Models”还是“ViewModels应该绑定到View,而不是View代码隐藏或Models”。
此外,在后续的XAML custom (templated) controls with C++/WinRT中,您使用DependencyProperties创建了一个BgLabelControl

<!-- MainPage.xaml -->
<local:BgLabelControl Background="Red" Label="Hello, World!"/>

但是它没有解释什么时候需要采用这种方法(相对于MainPage方法),也没有解释什么是UserControl(而不是Control)的惯用方法。
我不太清楚这些文件:

  • 一般来说,我应该选择(依赖项)属性还是直接ViewModel绑定?
  • 这在Control s、UserControl s和Page s之间是否不同?

结论

因此:
如何决定何时公开UserControl上的属性,或者何时将它们直接绑定到ViewModels?

woobm2wo

woobm2wo1#

没有明确的规则或原则,但让我回答你的问题。
一般来说,我应该选择(依赖项)属性还是直接ViewModel绑定?控件、用户控件和页面之间是否有区别?
DependencyProperties用于(自定义)ControlsUserControlsViewModels用于Pages

说明

  • 如果你在控件中只公开一个ViewModel,那么你的控件很难被其他模型重用。
    *ViewModel就像是一个适配器,在你的ViewModel之间工作,逻辑可能很简单,但要尽量简单。
  • 可以在代码隐藏中更改UI相关代码,如FilePickerDialogsVisualState

相关问题