我在多层应用程序中使用 Community.Toolkit.MVVM 中的源生成器时遇到问题

I am having an issue with using Source Generator from the Community.Toolkit.MVVM in a multi tiered application

提问人:Buck Hicks 提问时间:11/7/2023 更新时间:11/7/2023 访问量:35

问:

我正在使用 Microsoft 的社区工具包创建一个多层 WPF 应用程序。我的问题是我想使用工具包中的源生成器,但这要求 ViewModel 位于分部类中。因此,例如,下面的 View 和 ViewModel 的工作方式如下所示。当我的 ViewModel 需要是分部类而不是公共类时,我该如何做同样的事情?

视图:

<Window x:Class="PlantWorks.FirstPart.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:v="clr-namespace:PlantWorks.FirstPart"
        xmlns:vm="clr-namespace:PlantWorks.Biz.FirstPart;assembly=PlantWorks.Biz"
        mc:Ignorable="d"
        Title="MainView" Height="450" Width="800">

    <Window.DataContext>
        <vm:MainViewModel />
    </Window.DataContext>

    <Grid>
        <TextBlock Text="{Binding SampleText}" FontSize="24" />
    </Grid>
</Window>

视图模型:

//[ObservableObject]
public class MainViewModel : ObservableObject
{
    string sampleText = "Hello World";
    //[ObservableProperty] private string sampleText = "Hello World!!!";
    public string SampleText
    {
        get => sampleText;
        set
        {
            if (sampleText == value)
            {
                return;
            }

            sampleText = value;
            OnPropertyChanged();
        }
    }
}
C# WPF 源生成器 社区工具包 MVVM

评论


答:

2赞 Julian 11/7/2023 #1

您的 ViewModel 可以是:public partial class MainViewModel : ObservableObject

public partial class MainViewModel : ObservableObject
{
    [ObservableProperty] private string sampleText = "Hello World!!!";
}

源生成器生成类的其他部分。

您不需要该属性。[ObservableObject]

您仍然可以在 XAML 中引用 ViewModel,因为它已经拥有了。

评论

0赞 Buck Hicks 11/7/2023
这奏效了。现在说得通了,但我不知道你可以做一个公开的部分。
0赞 Julian 11/7/2023
partial不是访问修饰符,但它可以与任何访问修饰符结合使用,只要分部类的所有部分共享相同的可见性级别:stackoverflow.com/a/25399561/4308455