我有一个简单的用户控件,它实际上只是一个带有一些自定义逻辑的AutoCompleteBox。
对于特定实例(人员集合),我希望它看起来像这样:
<sdk:AutoCompleteBox Name="myACB" ItemsSource="{Binding People}" FilterMode="StartsWith" MinimumPrefixLength="2" ValueMemberBinding={Binding LastName}>
<sdk:AutoCompleteBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding LastName}" />
</DataTemplate>
</sdk:AutoCompleteBox.ItemTemplate>
</sdk:AutoCompleteBox>
但是,我想使数据源通用,因此显示值将不同(ValueMemberBinding和模板TextBlock文本)。这就是我制作自定义控件的原因,因此我可以指定与属性的差异。
使用用户控件属性设置源代码没有问题,但是我对显示绑定属性有困难。现在我有:
public static DependencyProperty DisplayMemberProperty = DependencyProperty.Register("DisplayMember", typeof(string), typeof(myAutoComplete), null);
public string DisplayMember
{
get
{ return myACB.ValueMemberPath; }
set
{
myACB.ValueMemberPath = value; // this works fine
// but how can set the text binding for the templated textblock?
}
}
我希望DisplayMember属性成为我绑定到AutoCompleteBox的任何类型的自定义集合(人员,汽车等)的属性名称。
我认为我不能以编程方式修改datatemplate。有没有办法用绑定(相对来源)来做到这一点?
答案 0 :(得分:2)
我不确定这是否有效,但我认为您可以将文本直接绑定到ValueMemberBinding属性并使用转换器从中获取文本...
答案 1 :(得分:0)
<TextBlock Text="{TemplateBinding DisplayMember}" />
答案 2 :(得分:0)
感谢您的建议。
我无法获得我更喜欢的解决方案,但我的解决方法是将一个datatemplate资源作为属性传入,并将其分配给autocompletebox itemtemplate。
定义模板:
<DataTemplate x:Key="myCustomDT">
<!-- whatever you want here -->
</DataTemplate>
为其创建用户控件属性:
public static DependencyProperty DisplayTemplateProperty = DependencyProperty.Register("DisplayTemplate", typeof(DataTemplate), typeof(myAutoComplete), null);
public DataTemplate DisplayTemplate {
get { return myACB.ItemTemplate; }
set { myACB.ItemTemplate = value; }
}
现在:
<local:myAutoComplete DisplayTemplate="{StaticResource myCustomDT}" />
不是最好的方法,但它现在可以使用。