Изменить представление с его ViewModel на основе свойства ViewModel
Насколько я знаю в WPF, вы можете сделать что-то вроде этого:
<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>
Мой вопрос: есть ли способ выбрать представление на основе свойства в вашей модели представления?
что-то вроде этого:
<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>
2 ответа
Будет ли это делать селектор таблицы данных?
Вот как это будет применяться к вашему сценарию:
Сначала создайте 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;
}
}
Я расширил учебник, включив в него свойства, которые можно назначить, когда нужно возвращать каждый шаблон.
Объявите ресурсы XAML
<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>
В этом примере мы объявили наш селектор, так что когда наше свойство имеет значение 1, возвращается template1, в противном случае мы получаем шаблон 2.
Добавление управления в XAML Наконец, требуется небольшой взлом - ваше свойство VM должно быть IEnumerable...
<ItemsControl ItemsSource="{Binding toProperty}"
ItemTemplateSelector="{StaticResource IronStageTemplateSelector}">
</ItemsControl>
Я надеюсь, что это поможет, пожалуйста, пометьте как ответ, если вы нашли это полезным
Является ли свойство модели представления известного типа во время компиляции? если это так, вы можете просто добавить элемент управления непосредственно в основное (родительское) представление и связать текстовый текст данных со свойством модели представления.
что-то вроде этого..
<Address:AddressControl Grid.Row="5" Grid.Column="0" Grid.ColumnSpan="6" DataContext=" {Binding PresentAddress}"/>
Просто дайте мне знать, если у вас другой сценарий.