声明 Avalonia Window 的设计时 ViewModel

Eti*_*and 6 .net c# mvvm avaloniaui

我正在寻找正确的方法来声明 Avalonia 窗口的设计时 ViewModel。

一些样本表明

d:DataContext="{d:DesignInstance viewModels:LoginViewModel, IsDesignTimeCreatable=True}"
Run Code Online (Sandbox Code Playgroud)

这会抛出

XamlParseException at 5:5: Unable to resolve type DesignInstance from namespace http://schemas.microsoft.com/expression/blend/2008
Run Code Online (Sandbox Code Playgroud)

默认 Avalonia MVVM 模板建议

<Design.DataContext>
    <vm:MainWindowViewModel/>
</Design.DataContext>
Run Code Online (Sandbox Code Playgroud)

如果 ViewModel 接受参数,它会抛出

XamlLoadException at 16:10: Unable to find public constructor for type Demo.CloseNonModalDialog:Demo.CloseNonModalDialog.CurrentTimeDialogViewModel()
Run Code Online (Sandbox Code Playgroud)

我想添加默认的无参数构造函数是一种选择。

使用 MvvmLight/WPF,我曾经将 ViewLocator 作为静态资源引用

DataContext="{Binding Source={StaticResource Locator}, Path=MainWindow}"
Run Code Online (Sandbox Code Playgroud)

这是一个选项,尽管我还没有找到声明和引用资源的正确方法。

这里推荐的方法是什么?如果我想显示设计时数据,我会说只有第三个选项才有效。这不是示例中显示的选项。

kek*_*eks 6

无法找到类型 Demo.CloseNonModalDialog:Demo.CloseNonModalDialog.CurrentTimeDialogViewModel() 的公共构造函数

您可以通过x:ArgumentsXAML 指令指定参数,请参阅https://learn.microsoft.com/en-us/dotnet/desktop/xaml-services/xarguments-directive

这是一个选项,尽管我还没有找到声明和引用资源的正确方法。

我建议声明DesignDataclass 并使用x:Static,它会给你更大的灵活性。例如

class DesignData
{
    public MyViewModel MyViewModel => new MyViewModel(...);
}
Run Code Online (Sandbox Code Playgroud)

d:DataContext="{x:Static local:DesignData.MyViewModel}"

与 StaticResource 方法不同,视图模型创建在正常应用程序执行期间也不会发生。