C# 在ContentControl中绑定空内容
我有ContentControl,我的DataTemplateSelector也支持空值C# 在ContentControl中绑定空内容,c#,xaml,uwp,win-universal-app,C#,Xaml,Uwp,Win Universal App,我有ContentControl,我的DataTemplateSelector也支持空值 <ContentControl Content="{x:Bind CurrentItem, Mode=OneWay}"> <ContentControl.DataTemplateSelector> <my:DataTemplateSelector> <my:DataTemplateSelector.NullTempla
<ContentControl Content="{x:Bind CurrentItem, Mode=OneWay}">
<ContentControl.DataTemplateSelector>
<my:DataTemplateSelector>
<my:DataTemplateSelector.NullTemplate>
<DataTemplate>
<Border Background="Red" />
</DataTemplate>
</my:DataTemplateSelector.NullTemplate>
<my:DataTemplateSelector.CustomTemplate1>
<DataTemplate>
<Border Background="Green" />
</DataTemplate>
</my:DataTemplateSelector.CustomTemplate1>
<my:DataTemplateSelector.CustomTemplate2>
<DataTemplate>
<Border Background="Blue" />
</DataTemplate>
</my:DataTemplateSelector.CustomTemplate2>
</my:DataTemplateSelector>
</ContentControl.DataTemplateSelector>
</ContentControl>
问题是当CurrentItem更改为null时,它不会调用DataTemplateSelector中的SelectTemplateCore方法。实际上,NullTemplate仅在首次加载控件且CurrentItem为null时才被选中
我可以用虚拟对象替换空值,但处理这个问题要困难得多。
我已经找到了解决方案,但它只适用于WPF(UWP没有Style.Triggers)我不确定您的
ContentControl.DataTemplateSelector是什么,我想它是UWP中的
问题是当CurrentItem更改为null时,它不会调用DataTemplateSelector中的SelectTemplateCore方法。实际上,NullTemplate仅在首次加载控件且CurrentItem为null时才被选中
是的,你说得对。稍后将CurrentItem
设置为null时,TemplateSelector
将不会再次运行到DataTemplateSelector
中。您需要的是为CurrentItem
创建一个可为null的属性。例如:
<Page.Resources>
<DataTemplate x:Key="NullTemplate">
<Border Background="Red" Height="300" Width="300">
<TextBlock Text="{Binding TemplateName}" />
</Border>
</DataTemplate>
<DataTemplate x:Key="CustomTemplate1">
<Border Background="Green" Height="300" Width="300">
<TextBlock Text="{Binding TemplateName}" />
</Border>
</DataTemplate>
<DataTemplate x:Key="CustomTemplate2">
<Border Background="Blue" Height="300" Width="300">
<TextBlock Text="{Binding TemplateName}" />
</Border>
</DataTemplate>
<local:MyDataTemplateSelector x:Key="MyDataTemplateSelector"
NullTemplate="{StaticResource NullTemplate}"
CustomTemplate1="{StaticResource CustomTemplate1}"
CustomTemplate2="{StaticResource CustomTemplate2}" />
</Page.Resources>
<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ComboBox x:Name="combo" SelectionChanged="combo_SelectionChanged">
<ComboBoxItem Content="NullTemplate" />
<ComboBoxItem Content="CustomTemplate1" />
<ComboBoxItem Content="CustomTemplate2" />
<ComboBoxItem Content="SetCurrentItemToNull" />
<ComboBoxItem Content="SetCurrentItemPropertyToNull" />
</ComboBox>
<ContentControl Content="{x:Bind CurrentItem, Mode=OneWay}" Margin="0,10"
ContentTemplateSelector="{StaticResource MyDataTemplateSelector}" />
</StackPanel>
ContentControlDataModel
如下所示:
public class ContentControlDataModel
{
public bool? Template { get; set; } //nullable property
public string TemplateName { get; set; }
}
以及MyDataTemplateSelector
:
public class MyDataTemplateSelector : DataTemplateSelector
{
public DataTemplate NullTemplate { get; set; }
public DataTemplate CustomTemplate1 { get; set; }
public DataTemplate CustomTemplate2 { get; set; }
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
{
var model = item as ContentControlDataModel;
if (model == null || model.Template == null)
return this.NullTemplate;
else
{
return (bool)model.Template ? this.CustomTemplate1 : this.CustomTemplate2;
}
}
}
渲染图像:
您可以通过选择组合框的不同项来检查差异,我不确定您的内容控件是什么。DataTemplateSelector
,我想它是UWP中的
问题是当CurrentItem更改为null时,它不会调用DataTemplateSelector中的SelectTemplateCore方法。实际上,NullTemplate仅在首次加载控件且CurrentItem为null时才被选中
是的,你说得对。稍后将CurrentItem
设置为null时,TemplateSelector
将不会再次运行到DataTemplateSelector
中。您需要的是为CurrentItem
创建一个可为null的属性。例如:
<Page.Resources>
<DataTemplate x:Key="NullTemplate">
<Border Background="Red" Height="300" Width="300">
<TextBlock Text="{Binding TemplateName}" />
</Border>
</DataTemplate>
<DataTemplate x:Key="CustomTemplate1">
<Border Background="Green" Height="300" Width="300">
<TextBlock Text="{Binding TemplateName}" />
</Border>
</DataTemplate>
<DataTemplate x:Key="CustomTemplate2">
<Border Background="Blue" Height="300" Width="300">
<TextBlock Text="{Binding TemplateName}" />
</Border>
</DataTemplate>
<local:MyDataTemplateSelector x:Key="MyDataTemplateSelector"
NullTemplate="{StaticResource NullTemplate}"
CustomTemplate1="{StaticResource CustomTemplate1}"
CustomTemplate2="{StaticResource CustomTemplate2}" />
</Page.Resources>
<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ComboBox x:Name="combo" SelectionChanged="combo_SelectionChanged">
<ComboBoxItem Content="NullTemplate" />
<ComboBoxItem Content="CustomTemplate1" />
<ComboBoxItem Content="CustomTemplate2" />
<ComboBoxItem Content="SetCurrentItemToNull" />
<ComboBoxItem Content="SetCurrentItemPropertyToNull" />
</ComboBox>
<ContentControl Content="{x:Bind CurrentItem, Mode=OneWay}" Margin="0,10"
ContentTemplateSelector="{StaticResource MyDataTemplateSelector}" />
</StackPanel>
ContentControlDataModel
如下所示:
public class ContentControlDataModel
{
public bool? Template { get; set; } //nullable property
public string TemplateName { get; set; }
}
以及MyDataTemplateSelector
:
public class MyDataTemplateSelector : DataTemplateSelector
{
public DataTemplate NullTemplate { get; set; }
public DataTemplate CustomTemplate1 { get; set; }
public DataTemplate CustomTemplate2 { get; set; }
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
{
var model = item as ContentControlDataModel;
if (model == null || model.Template == null)
return this.NullTemplate;
else
{
return (bool)model.Template ? this.CustomTemplate1 : this.CustomTemplate2;
}
}
}
渲染图像:
您可以通过选择组合框的不同项来检查差异
如果您使用绑定
,并使用显式的TargetNullValue
(或转换器
)返回一个伪值,而不是x:Bind
,您是否检查了我的答案?有问题吗?如果您使用带有显式返回伪值的TargetNullValue
(或转换器)的绑定来代替x:Bind
,该怎么办?您是否检查了我的答案?有什么问题吗?