更改视图,其视图模型基于一个ViewModel属性视图、属性、模型、ViewModel

2023-09-03 01:47:43 作者:悲喜难自渡

据我所知,在WPF可以做这样的事情:

 < Window.Resources>
    < D​​ataTemplate中数据类型={X:类型的ViewModels:IronStage1ViewModel}>
        <浏览次数:IronStage1View />
    < / DataTemplate中>

    < D​​ataTemplate中数据类型={X:类型的ViewModels:IronStage2ViewModel}>
        <浏览次数:IronStage2View />
    < / DataTemplate中>
    <浏览次数:TestStageToTabIndexConverter X:关键=TestStageToTabIndexConverter/>
< /Window.Resources>
 

我的问题: 有什么办法根据您的视图模型的属性来选择查看?

是这样的:

 < Window.Resources> //如果属性选择器== 1
    < D​​ataTemplate中数据类型={X:类型的ViewModels:IronStage1ViewModel}>
        <浏览次数:IronStage1View />
    < / DataTemplate中>

                   //如果属性选择器== 2
    < D​​ataTemplate中数据类型={X:类型的ViewModels:IronStage1ViewModel}>
        <浏览次数:IronStage2View />
    < / DataTemplate中>
< /Window.Resources>
 

解决方案

请问一个DataTemplate选择这样做?

tekla17.0视图属性里没有视图类型一个选项啊,怎么调出来

教程这里

这是如何做到这一点适用于您的方案:

首先创建一个DataTemplateSelector:

 公共类IronStageTemplateSelector:DataTemplateSelector
{
    公众的DataTemplate IronStage1Template {获得;组; }
    公众的DataTemplate IronStage2Template {获得;组; }

    公共对象IronStage1Selector {获得;组; }
    公共对象IronStage2Selector {获得;组; }

    公众覆盖的DataTemplate SelectTemplate(对象选择,
      DependencyObject的容器)
    {
        如果(选择== this.IronStage1Selector)
        {
            返回IronStage1Template;
        }

        返回IronStage2Template;
    }
}
 

我已经扩展了教程,包括属性,你可以指定何时返回每个模板。

声明XAML资源

 < UserControl.Resources>
    < D​​ataTemplate中X:关键=iron1Template>
        <的TextBlock />
    < / DataTemplate中>

    < D​​ataTemplate中X:关键=iron2Template>
        <标签/>
    < / DataTemplate中>

    <系统:双X:关键=Selector1> 1< /系统:双>
    <系统:双X:关键=Selector2> 2'; /系统:双>

    <地方:IronStageTemplateSelector X:关键=IronStageTemplateSelector
                                     IronStage1Selector ={的StaticResource Selector1}
                                     IronStage2Selector ={的StaticResource Selector2}
                                     IronStage1Template ={的StaticResource iron1Template}
                                     IronStage2Template ={的StaticResource iron2Template}/>
< /UserControl.Resources>
 

在这个例子中,我们已经宣布我们的选择,这样,当我们的财产有值为1,则返回template1的,否则我们得到的模板2。

控件添加到XAML 最后,一​​个小黑客是必要的 - 你的虚拟财产必须是IEnumerable的...

 < ItemsControl中的ItemsSource ={结合toProperty}
     ItemTemplateSelector ={的StaticResource IronStageTemplateSelector}>
< / ItemsControl的>
 

我希望这会有所帮助,如果你发现了,请标记为答案有用

As far as I know in WPF you can do something like this:

<Window.Resources>
    <DataTemplate DataType="{x:Type ViewModels:IronStage1ViewModel}">
        <Views:IronStage1View/>
    </DataTemplate>

    <DataTemplate DataType="{x:Type ViewModels:IronStage2ViewModel}">
        <Views:IronStage2View/>
    </DataTemplate>
    <Views:TestStageToTabIndexConverter x:Key="TestStageToTabIndexConverter" />
</Window.Resources>

My question: Is there any way to choose the View based on a property in your ViewModel?

something like this:

<Window.Resources> //If property Selector==1
    <DataTemplate DataType="{x:Type ViewModels:IronStage1ViewModel}"> 
        <Views:IronStage1View/>
    </DataTemplate>

                   // If property Selector==2
    <DataTemplate DataType="{x:Type ViewModels:IronStage1ViewModel}">
        <Views:IronStage2View/>
    </DataTemplate>
</Window.Resources>

解决方案

Would a datatemplate selector do this?

tutorial here

This is how this would apply to your scenario:

First create a DataTemplateSelector:

public class IronStageTemplateSelector : DataTemplateSelector
{
    public DataTemplate IronStage1Template { get; set; }
    public DataTemplate IronStage2Template { get; set; }

    public object IronStage1Selector { get; set; }
    public object IronStage2Selector { get; set; }

    public override DataTemplate SelectTemplate(object selector,
      DependencyObject container)
    {
        if(selector == this.IronStage1Selector)
        {
            return IronStage1Template;
        }

        return IronStage2Template;
    }
}

I have extended the tutorial to include properties you can assign for when to return each template.

Declare the XAML resources

<UserControl.Resources>
    <DataTemplate x:Key="iron1Template">
        <TextBlock/>
    </DataTemplate>

    <DataTemplate x:Key="iron2Template">
        <Label />
    </DataTemplate>

    <System:Double x:Key="Selector1">1</System:Double>
    <System:Double x:Key="Selector2">2</System:Double>

    <local:IronStageTemplateSelector x:Key="IronStageTemplateSelector" 
                                     IronStage1Selector="{StaticResource Selector1}"
                                     IronStage2Selector="{StaticResource Selector2}"
                                     IronStage1Template="{StaticResource iron1Template}"
                                     IronStage2Template="{StaticResource iron2Template}"/>
</UserControl.Resources>

In this example we have declared our selector so that when our property has value 1, template1 is returned, otherwise we get template 2.

Add Control to XAML Finally, a little hack is needed - your VM property needs to be IEnumerable...

<ItemsControl ItemsSource="{Binding toProperty}" 
     ItemTemplateSelector="{StaticResource IronStageTemplateSelector}">
</ItemsControl>

I hope this helps, please mark as answer if you found it useful

 
精彩推荐
图片推荐