Можно ли обновить DataTemplate в коде? - PullRequest
0 голосов
/ 23 декабря 2018

Есть ли способ обновить DataTemplate в коде?

У меня есть простой DataTemplate, содержащий одно изображение.Он используется для свойства ContentTemplate стороннего элемента управления для представления видимого изображения элемента управления.(Я не могу контролировать это требование.) Вот определение XAML DataTemplate с общим «неизвестным» изображением:

    <DataTemplate x:Key="ControlImageDataTemplate">
        <Image Source="Assets/UnknownImage.png"/>
    </DataTemplate>

В моем приложении разные экземпляры элементов управления могут иметь разные изображения, и я не знаю,какое изображение использовать до времени выполнения.Поэтому мне нужно обновить источник изображения DataTemplate во время выполнения кода.В идеале я хотел бы сделать что-то вроде этого:

    // Update the DataTemplate
    ControlImageDataTemplate.Image.Source = new BitmapImage("Assets/RunTimeImage.png"); // CAN'T DO THIS!!!

    // Assign the updated DataTemplate to the control instance
    ThirdPartyControl.ContentTemplate = (DataTemplate)Resources["ControlImageDataTemplate"];

Однако я не смог найти способ обновить DataTemplate в коде.Это возможно?Или есть альтернатива?

1 Ответ

0 голосов
/ 27 декабря 2018

Как и другие пользователи предложили в комментариях, идеальный способ сделать это с помощью DataTemplateSelector.

Прежде всего, вам нужно получить класс DataTemplateSelector, создать свой собственный и переопределитьметод SelectTemplateCore:

public class SampleDataTemplateSelector : DataTemplateSelector
{
    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        if (item != null && container != null && <<item is a specific object>>)
        {
            // Put your logic code here in order to determine what case is the right one
            if (<<case 1>>) return SampleDataTemplate1;
            else if (<<case 2>>) return SampleDataTemplate2;
            //…
        }
    }
}

Затем поместите эти ресурсы в свой App.xaml (или в ресурсы своей страницы):

<Application.Resources>
    <templateSelectorNamespace:SampleDataTemplateSelector x:Key="SampleTemplateSelector"/>

    <DataTemplate x:Key="SampleDataTemplate1">
        <Image Source="Assets/Image1.png"/>
    </DataTemplate>
    <DataTemplate x:Key="SampleDataTemplate2">
        <Image Source="Assets/Image2.png"/>
    </DataTemplate>
</Application.Resources>

Затем на своей странице просто используйтеэто с производным элементом управления ItemsControl.Вот способ использовать его, например, в ListView:

<ListView ItemsSource="{x:Bind ViewModel.Elements, Mode=OneWay}" ItemTemplateSelector="{StaticResource SampleTemplateSelector}" HorizontalContentAlignment="Stretch"/>

С уважением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...