Я хотел был бы иметь возможность изменить DataTemplate
, что мой пользовательский класс использует, основываясь на свойстве в ViewModel
.Как изменить DataTemplate настраиваемого типа на основе свойства ViewModel?
Я не могу найти каких-либо ясных примеров, и я чувствую, что могу не знать достаточно о WPF
или XAML
, чтобы узнать, возможно ли это.
Свойство ViewModel
: представляет ли пользователь свернутый столбец с одной стороны приложения. Если столбец свернут, я хочу показать только изображение для каждого пользователя, и если столбец будет расширен, я покажу изображение, имя и фамилию в StackPanel
.
Я чувствую, что есть что-то действительно основное, что я пока еще не понимаю, и я думаю, что ищу кого-то, кто, возможно, пробовал что-то вроде этого или знает, как это сделать правильно.
User.cspublic class User
{
public string ImageFile {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
}
Я использую ObservableCollection<User>
держать мою коллекцию User
объектов в ViewModel. Мои 2 DataTemplates, которые я хотел бы использовать. (Сейчас я просто использовать изображение по умолчанию и текст, чтобы увидеть, как она выглядит)
<DataTemplate x:Key="UserCollapsed">
<Image Source="/Images/anon.png"
Height="50"
Width="50"
Margin="0,5,0,0"/>
</DataTemplate>
<DataTemplate x:Key="UserExpanded">
<StackPanel>
<Image Source="/Images/anon.png"
Height="50"
Width="50"
Margin="0,5,0,0"/>
<TextBlock Text="Firstname"/>
<TextBlock Text="Lastnamehere"/>
</StackPanel>
</DataTemplate>
Я пытался написать стиль, и применить это к моей ItemsControl в представлении, и я пробовал написать datatemplate, который использует триггеры, чтобы решить, какой шаблон использовать, но я не могу понять, где я ошибаюсь.
Стиль
<Style x:Key="userTemplateStyle" TargetType="ItemsControl">
<Setter Property="ItemTemplate" Value="{StaticResource UserExpanded}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ColumnIsCollapsed, Source={StaticResource ViewModel}}" Value="True">
<Setter Property="ItemTemplate" Value="{StaticResource UserCollapsed}"/>
</DataTrigger>
</Style.Triggers>
</Style>
Я получаю следующее исключение, когда я добавляю свойство Style на моем ItemsControl в XAML.
Исключение
{"Unable to cast object of type 'MS.Internal.NamedObject' to type 'System.Windows.DataTemplate'."}
И DataTemplate, что я пытался использовать в качестве ItemTemplate от ItemsControl. (Я чувствую, что это неправильный способ пойти об этом, но я пытался так или иначе)
DataTemplate
<DataTemplate DataType="{x:Type md:CUser}">
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding ColumnIsCollapsed, Source={StaticResource ViewModel}}" Value="True">
<Setter Property="DataTemplate" Value="{StaticResource UserCollapsed}"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
ItemsControl
<ItemsControl Visibility="{Binding ColumnVisibility}"
Style="{StaticResource userTemplateStyle}"
BorderThickness="0"
Name="itcLoggedInUsers"
Margin="0"
ItemsSource="{Binding LoggedInUsers}"
Grid.Row="1"/>
Читайте на DataTemplateSelector, вот хороший пример http://tech.pro/tutorial/807/wpf-tutorial-how-to-use- a-datatemplateselector – Phil
@Phil Да, если у вас есть пример, специфичный для моих потребностей, свойство в * ViewModel * не сама модель, то, во всяком случае, ссылка. http://tech.pro/tutorial/807/wpf-tutorial-how-to-use-a-datatemplateselector Я пытаюсь выяснить, нужен ли DataTemplateSelector, что мне нужно, и выяснил, что он не работает в мой случай AFAIK. – Zack
Пример в вашей ссылке дает вам всю необходимую информацию. Посмотрите на свой собственный класс datatemplateselector, он принимает объект item и кастинг в строку. Если вы не используете строки, добавьте в свой соответствующий объект, который будет вашей моделью просмотра. Затем напишите свою логику, сравнив свойство на viewmodel и верните соответствующий шаблон данных. – failedprogramming