我是否可以在ViewModel中定义XAML元素,并使用C++/WinRT和WinUI 3直接在视图中使用它?

eyh26e7m  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(130)

关于在ViewModel中使用视图中的XAML元素,已经提出了许多问题。但是,在ViewModel中定义XAML元素并在视图的XAML标记中使用它呢?这样,ViewModel从一开始就知道该元素(并 * 拥有 * 该元素)。
我试图这样做,认为它会更符合MVVM--ViewModel不必知道整个视图就可以使用这个组件。但是我认识到在ViewModel中定义XAML元素仍然不符合MVVM的精神。但是在这一点上,我只想知道这种技术是否可行。
我知道我可以在ViewModel中定义一个 property,然后将其绑定到视图中定义的XAML元素的 property。例如,在ViewModel中定义一个字符串,然后将其绑定到TextBlock XAML元素的Text属性。但是,是否可以简单地在ViewModel中定义XAML元素本身,然后在视图的XAML标记中使用它?
示例代码。我正在使用C++/WinRT与WinUI 3:

主窗口视图模型.idl

namespace MyApp
{
    runtimeclass FooViewModel
    {
        MainWindowViewModel();
        Int32 IntProperty; // I can bind this to a XAML element's property
        Microsoft.UI.Xaml.Controls.Frame Frame; // Can I use this in the View?
    }
}

主窗口.idl(视图)

import "ViewModel/MainWindowViewModel.idl";
namespace MyApp
{
    runtimeclass MainWindow : Micorosoft.UI.Xaml.Window
    {
        MainWindow();
        MainWindowViewModel MainWindowViewModel{ get; };
    }
}

主窗口.xaml(视图的XAML)

<Window
    x:Class="MyApp.MainWindow"
    //...
    >

    <StackPanel>
        // I can bind to a property of MainWindowViewModel as such:
        <Slider Minimum="0" Maximum="{x:Bind MainWindowViewModel.IntProperty}" />

        // Is there a way to use the Frame defined in MainWindowViewModel here, or can you only create a new Frame instance?
        <Frame/>
    </StackPanel
</Window>
lx0bsm1f

lx0bsm1f1#

是否可以在ViewModel中简单地定义XAML元素本身,然后在视图的XAML标记中使用它?
是的,这将是工作。
我在WinUI3 C#中测试了它,代码工作正常。

相关问题