gpt4 book ai didi

wpf - 将属性绑定(bind)到 DataTemplateSelector

转载 作者:行者123 更新时间:2023-12-02 05:12:34 25 4
gpt4 key购买 nike

我想设计一个 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),则效果非常好。当我尝试通过应用绑定(bind)使其动态化时,出现以下错误:

A 'Binding' cannot be set on the 'ValueToCompare' property of type 'InferiorSuperiorTemplateSelector'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.

问题来了:我们如何在 DataTemplateSelector 中声明 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>

代码的其他部分类似。

最佳答案

从错误中可以明显看出您只能使用依赖属性进行绑定(bind)。 但由于它已经继承自 DataTemplateSelector,因此您无法继承自 DependencyObject 类。

所以,我建议创建一个 Attached property 用于约束目的。但 catch 附加属性只能应用于从 DependencyObject 派生的类。

因此,您需要进行一些调整才能使其适合您。让我一步步解释。

<小时/>

首先 - 按照上面的建议创建附加属性:

public class DataTemplateParameters : DependencyObject
{
public static double GetValueToCompare(DependencyObject obj)
{
return (double)obj.GetValue(ValueToCompareProperty);
}

public static void SetValueToCompare(DependencyObject obj, double value)
{
obj.SetValue(ValueToCompareProperty, value);
}

public static readonly DependencyProperty ValueToCompareProperty =
DependencyProperty.RegisterAttached("ValueToCompare", typeof(double),
typeof(DataTemplateParameters));

}

第二 - 正如我所说,它只能在从 DependencyObject 派生的对象上设置,因此在 ContentControl 上设置它:

<ContentControl Grid.Row="2" Content="{Binding Path=PropertyName}"
local:DataTemplateParameters.ValueToCompare="{Binding DecimalValue}">
<ContentControl.ContentTemplateSelector>
<local:InferiorSuperiorTemplateSelector
SuperiorTemplate="{StaticResource SuperiorTemplate}"
InferiorTemplate="{StaticResource InferiorTemplate}" />
</ContentControl.ContentTemplateSelector>
</ContentControl>

第三。 - 现在您可以从作为参数传递的容器对象获取模板内的值。使用 VisualTreeHelper 获取 Parent (ContentControl) 并从中获取附加属性的值。

public override System.Windows.DataTemplate SelectTemplate(object item, 
System.Windows.DependencyObject container)
{
double dpoint = Convert.ToDouble(item);
double valueToCompare = (double)VisualTreeHelper.GetParent(container)
.GetValue(DataTemplateParameters.ValueToCompareProperty); // HERE
// double valueToCompare = (container as FrameworkElement).TemplatedParent;
return (dpoint >= valueToCompare) ? SuperiorTemplate : InferiorTemplate;
}

您还可以像这样获取 ContentControl (容器为 FrameworkElement).TemplatedParent

关于wpf - 将属性绑定(bind)到 DataTemplateSelector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22011005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com