据我所知,在WPF可以做这样的事情:
< Window.Resources>
< DataTemplate中数据类型={X:类型的ViewModels:IronStage1ViewModel}>
<浏览次数:IronStage1View />
< / DataTemplate中>
< DataTemplate中数据类型={X:类型的ViewModels:IronStage2ViewModel}>
<浏览次数:IronStage2View />
< / DataTemplate中>
<浏览次数:TestStageToTabIndexConverter X:关键=TestStageToTabIndexConverter/>
< /Window.Resources>
我的问题: 有什么办法根据您的视图模型的属性来选择查看?
是这样的:
< Window.Resources> //如果属性选择器== 1
< DataTemplate中数据类型={X:类型的ViewModels:IronStage1ViewModel}>
<浏览次数:IronStage1View />
< / DataTemplate中>
//如果属性选择器== 2
< DataTemplate中数据类型={X:类型的ViewModels:IronStage1ViewModel}>
<浏览次数:IronStage2View />
< / DataTemplate中>
< /Window.Resources>
解决方案
请问一个DataTemplate选择这样做?
教程这里
这是如何做到这一点适用于您的方案:
首先创建一个DataTemplateSelector:
公共类IronStageTemplateSelector:DataTemplateSelector
{
公众的DataTemplate IronStage1Template {获得;组; }
公众的DataTemplate IronStage2Template {获得;组; }
公共对象IronStage1Selector {获得;组; }
公共对象IronStage2Selector {获得;组; }
公众覆盖的DataTemplate SelectTemplate(对象选择,
DependencyObject的容器)
{
如果(选择== this.IronStage1Selector)
{
返回IronStage1Template;
}
返回IronStage2Template;
}
}
我已经扩展了教程,包括属性,你可以指定何时返回每个模板。
声明XAML资源
< UserControl.Resources>
< DataTemplate中X:关键=iron1Template>
<的TextBlock />
< / DataTemplate中>
< DataTemplate中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