wpf 绑定用于切换用户控件的数据模板时出错

disbfnqx  于 2023-08-07  发布在  其他
关注(0)|答案(2)|浏览(157)

我是WPF的新手,在绑定上挣扎了很多天。我试图切换用户控制点击menuitems,使用数据模板与数据类型的视图模型
数据模板:-

<DataTemplate DataType="{x:Type vm:AppleViewModel}">
    <views:AppleView/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:MangoViewModel}">
    <views:MangoView/>
</DataTemplate>

字符串
属性的绑定已在内容控件中完成:-

<ContentControl Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="1" Content="{Binding}" ContentTemplate="{Binding CurrentViewModel}" />


从ObservableObject继承的BaseViewModel.cs(使用MVVM ToolKit):-
我试着分配ViewModel的类型,new ViewModel等,如下所示:

[ObservableProperty]
    public object? currentViewModel;

    [RelayCommand]
    private void Navigate(string menu)
    {
        switch (menu)
        {
            case "Apple":
                CurrentViewModel = (typeof(AppleViewModel));
                break;
            case "Mango":
                CurrentViewModel = new MangoViewModel();
                break;
        }
    }


但我得到以下错误,内容没有按照数据模板进行更改。
x1c 0d1x的数据
错误消息1:无法使用转换器“ObjectSourceConverter”将值“XYTool.ViewModels.MangoViewModel”(类型“MangoViewModel”)转换为目标类型。回退值将在可用时使用。NotSupportedException:'System.NotSupportedException:TypeConverter无法从XYTool. ViewModels. MangoViewModel进行转换。
错误消息2:无法使用默认转换将“XYTool.ViewModels.MangoViewModel”从类型“MangoViewModel”转换为“en-US”区域性的类型“System.Windows.DataTemplate”;请考虑使用Binding的Converter属性。NotSupportedException:'System.NotSupportedException:TypeConverter无法从XYTool. ViewModels. MangoViewModel进行转换。

wbgh16ku

wbgh16ku1#

你应该创建视图模型的示例,指定它们的类型不会使它们出现:

[ObservableProperty]
public object? currentViewModel;

[RelayCommand]
private void Navigate(string menu)
{
    switch (menu)
    {
        case "Apple":
            CurrentViewModel = new AppleViewModel();
            break;
        case "Mango":
            CurrentViewModel = new MangoViewModel();
            break;
    }
}

字符串
然后在xaml中只绑定内容。将为内容类型找到默认的ContentTemplate:

<ContentControl Content="{Binding CurrentViewModel}" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" />

pkwftd7m

pkwftd7m2#

首先,您应该了解ContentControl的属性是什么。Content显示的内容(考虑视图模型),ContentTemplate如何**显示的(考虑视图)。
选择1:
像这样编写ContentControl绑定

<ContentControl Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="1" Content="{Binding CurrentViewModel}" />

字符串
并确保DataTemplate定义在同一个文件中,而不是在外部资源字典中。
备选方案二:
你可以这样定义ContentTemplateSelector

public class FruitTemplateSelector : DataTemplateSelector
{
    public DataTemplate AppleTemplate { get; set; }

    public DataTemplate MangoTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        return item switch
        {
            AppleViewModel => AppleTemplate,
            MangoViewModel => MangoTemplate,
            _ => base.SelectTemplate(item, container)
        };
    }
}


然后这样使用:

<ContentControl Content="{Binding CurrentViewModel}">
    <ContentControl.ContentTemplateSelector>
        <local:FruitTemplateSelector>
            <local:FruitTemplateSelector.AppleTemplate>
                <DataTemplate DataType="{x:Type vm:AppleViewModel}">
                    <views:AppleView/>
                </DataTemplate>
            </local:FruitTemplateSelector.AppleTemplate>
            <local:FruitTemplateSelector.MangoTemplate>
                <DataTemplate DataType="{x:Type vm:MangoViewModel}">
                    <views:MangoView/>
                </DataTemplate>
            </local:FruitTemplateSelector.MangoTemplate>
        </local:FruitTemplateSelector>
    </ContentControl.ContentTemplateSelector>
</ContentControl>

相关问题