首页 > 解决方案 > 是否可以在代码中更新 DataTemplate?

问题描述

有没有办法在代码中更新 DataTemplate?

我有一个包含单个图像的简单 DataTemplate。它用于第 3 方控件的 ContentTemplate 属性来表示控件的可视图像。(我无法控制这个要求。)这是带有通用“未知”图像的 DataTemplate 的 XAML 定义:

    <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 的方法。这可能吗?还是有替代方案?

标签: c#uwpdatatemplate

解决方案


正如其他用户在评论中所建议的那样,完美的方法是使用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(或您的 Page 的资源)中:

<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"/>

此致


推荐阅读