You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在C++/WinRT+WinUI3的ViewModel中定义XAML元素并在View中使用?

在ViewModel中定义XAML元素并在View的XAML中使用是否可行?

之前已经有不少关于在ViewModel中调用View里XAML元素的讨论,那反过来——能不能在ViewModel里定义XAML元素,再在View的XAML标记中直接使用这个元素,让ViewModel从一开始就持有并管理它?

我原本尝试这么做,一度觉得这样更贴合MVVM规范(ViewModel不用了解整个View就能用指定组件),但后来也意识到这其实违背了MVVM的核心思想。不过现在我只想知道这种技术实现是否可行。

我知道常规的做法是在ViewModel中定义属性,再绑定到View中XAML元素的对应属性,比如在ViewModel里定义字符串属性,绑定到TextBlock的Text属性。但我想知道的是:能不能直接在ViewModel中定义XAML元素本身,然后在View的XAML里引用这个已定义的元素?


示例代码(C++/WinRT + WinUI3)

MainWindowViewModel.idl

namespace MyApp
{
    runtimeclass FooViewModel
    {
        MainWindowViewModel();
        Int32 IntProperty; // 我可以将这个属性绑定到XAML元素的属性上
        Microsoft.UI.Xaml.Controls.Frame Frame; // 能否在View中使用这个Frame?
    }
}

MainWindow.idl(View层)

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

MainWindow.xaml(View层XAML)

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

    <StackPanel>
        // 我可以像这样绑定MainWindowViewModel的属性:
        <Slider Minimum="0" Maximum="{x:Bind MainWindowViewModel.IntProperty}" />

        // 有没有办法使用MainWindowViewModel中定义的Frame?还是只能在这里新建一个Frame实例?
        <Frame/>
    </StackPanel
</Window>

内容的提问来源于stack exchange,提问作者Aaron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 09:35:34