我不喜欢为这样的功能使用代码。我宁愿建议在绑定标记中实现一个可用的 DataTemplateConverter 来实现这个确切的功能。
例如:
<ContentControl ContentTemplate="{Binding Converter={StaticResource templateConverter}, Path=yourbindingpath}"/>
转换器将在 xaml 文件的资源部分中实例化。
<myControls:EmptyDataTemplateConverter x:Key="templateConverter">
<myControls:EmptyDataTemplateConverter.NonEmpty>
<DataTemplate>[...]</DataTemplate>
</myControls:EmptyDataTemplateConverter.NonEmpty>
<myControls:EmptyDataTemplateConverter.Empty>
<DataTemplate>[...]</DataTemplate>
</myControls:EmptyDataTemplateConverter.Empty>
</myControls:EmptyDataTemplateConveter>
在这种情况下,Empty/NonEmpty 实现取决于您。
要了解如何实现这样的 ValueConverter,请参阅 MSDN(或 google)
添加了示例。你可以使用 DataTemplate 的依赖属性,但为了简单起见,我在这里做了。
public class EmptyDataTemplateConverter: IValueConverter
{
public DataTemplate Empty{get;set;}
public DataTemplate NonEmpty{get;set;}
// This converts the DateTime object to the DataTemplate to use.
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
if(IsEmpty(value))
{
return this.Empty;
}
else
{
return this.NonEmpty;
}
}
//Your "empty/not empty" implementation here. Mine is rather... incomplete.
private bool IsEmpty(object value)
{
return value!=null;
}
// No need to implement converting back on a one-way binding
public object ConvertBack(object value, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
编辑:
实现相同目标的其他方式,但更多的是“Silverlight 方式”。使用GoToStateAction 和适当的触发器。将您的模板图形封装在 UserControl 中,并为此 UserControl 指定状态。这样,用户控件将根据触发器的行为(空/非空)而改变。
结果将与我之前的提议相同,但具有状态更改动画的额外好处,使用 DataTemplateConverter 很难实现(修改后的 TransitioningContentControl)。