是否可以在代码中更新 DataTemplate?
Is it possible to update a DataTemplate in code?
有没有办法在代码中更新数据模板?
我有一个包含单个图像的简单 DataTemplate。它用于第 3 方控件的 ContentTemplate 属性 以表示控件的可视图像。 (我无法控制此要求。)这是带有通用 "unknown" 图像的 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 的方法。这可能吗?或者有其他选择吗?
正如其他用户在评论中所建议的那样,完美的方法是使用 DataTemplateSelector
。
首先,您需要派生 DataTemplateSelector
class,创建自己的方法,并覆盖 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"/>
此致
有没有办法在代码中更新数据模板?
我有一个包含单个图像的简单 DataTemplate。它用于第 3 方控件的 ContentTemplate 属性 以表示控件的可视图像。 (我无法控制此要求。)这是带有通用 "unknown" 图像的 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 的方法。这可能吗?或者有其他选择吗?
正如其他用户在评论中所建议的那样,完美的方法是使用 DataTemplateSelector
。
首先,您需要派生 DataTemplateSelector
class,创建自己的方法,并覆盖 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"/>
此致