我希望设计一个DataTemplateSelector,该选择器将给定值与传递的参数进行比较,如果该值大于或小于参数,则选择正确的模板。
我提出了以下方案:
class InferiorSuperiorTemplateSelector : DataTemplateSelector
{
public DataTemplate SuperiorTemplate { get; set; }
public DataTemplate InferiorTemplate { get; set; }
public double ValueToCompare { get; set; }
public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
{
double dpoint = Convert.ToDouble(item);
return (dpoint >= ValueToCompare || dpoint == null) ? SuperiorTemplate : InferiorTemplate;
}
}
以及 XAML:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="30" />
<RowDefinition Height="30" />
</Grid.RowDefinitions>
<TextBox Name="theValue" Grid.Row="0">1</TextBox>
<ContentControl Grid.Row="2" Content="{Binding ElementName=theValue, Path=Text}" >
<ContentControl.ContentTemplateSelector>
<sel:InferiorSuperiorTemplateSelector ValueToCompare="12" SuperiorTemplate="{StaticResource posTemplate}" InferiorTemplate="{StaticResource negTemplate}" />
</ContentControl.ContentTemplateSelector>
</ContentControl>
</Grid>
如果手动设置valueToCompare参数(例如这里设置为12),则它可以很好地工作。 但是,当我尝试通过应用绑定来使其动态化时,我遇到了以下错误:
无法在类型为“InferiorSuperiorTemplateSelector”的“ValueToCompare”属性上设置“Binding”。仅可以在DependencyObject的DependencyProperty上设置“Binding”。
这里出现了问题:我们如何在DataTemplateSelector中声明DependencyProperty或是否有其他选项可以实现此目标? 我尝试使用通常的方法定义dependencyproperty,但我无法解决SetValue和GetValue方法。
提前致谢。
编辑:作为上述解决方案的附录,这是我的示例修复后的XAML代码。
<TextBox Name="theValue" Grid.Row="0">1</TextBox>
<TextBox Name="theValueToCompare" Grid.Row="1">50</TextBox>
<ContentControl Grid.Row="2" Content="{Binding ElementName=theValue, Path=Text}"
local:DataTemplateParameters.ValueToCompare="{Binding ElementName=theValueToCompare, Path=Text}">
<ContentControl.ContentTemplateSelector>
<local:InferiorSuperiorTemplateSelector SuperiorTemplate="{StaticResource posTemplate}" InferiorTemplate="{StaticResource negTemplate}" />
</ContentControl.ContentTemplateSelector>
</ContentControl>
代码的其他部分类似。