定义要绑定的自定义属性
Posted
技术标签:
【中文标题】定义要绑定的自定义属性【英文标题】:Define a custom property to bind to 【发布时间】:2011-07-19 18:41:03 【问题描述】:是否可以将用户控件中的控件项绑定到通过绑定指定名称的属性?
类似这样,但没有产生错误:
在哪里
CheckListItems
(DP) 是项目集合(IList<SomeCustomContainerType>)
ItemPropertyName
(DP) 是 SomeCustomContainerType
中的属性名称,应显示为复选框文本
Root
是用户控件的名称
这种情况下的例外情况(预期)如下:
不能在“绑定”类型的“路径”属性上设置“绑定”。 只能在 DependencyObject 的 DependencyProperty 上设置“绑定”。基本上我想从外部传递属性名称,其文本应以某种方式显示在复选框中。它不必是可绑定的,但应该可以通过使用用户控件的 XAML 进行设置。
【问题讨论】:
【参考方案1】:一种可能性是使用带有 ConverterParameter 的 ValueConverter 作为属性的名称。在 ValueConverter 实现中,您可以使用反射加载值。
转换器可能看起来像这样:
[ValueConversion(typeof(string), typeof(string))]
public class ReflectionConverter : IValueConverter
public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
if (parameter != null)
Type type = value.GetType();
System.Reflection.PropertyInfo prop = type.GetProperty (parameter.ToString());
return prop.GetValue(value, null);
return value;
public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
return null;
添加错误处理...
【讨论】:
感谢您的想法,我会试一试,它可能会起作用;)您不必编写示例代码。 好的,我卡住了。如何从依赖属性加载 ConverterParameter?我不能把绑定放在这里。 我也只是想尝试一下,我在答案中编辑了代码示例 嗯,抱歉,它不会真正起作用。没想到CommandParameter也不能绑定...【参考方案2】:您是否尝试过使用DisplayMemberPath?
here是一个如何使用它的例子
试试这个,看看它是否有效:
<ItemsControl ItemsSource="Binding Path=CheckListItems, ElementName=Root" DisplayMemberPath="Binding ItemPropertyName, ElementName=Root">
<ItemsControl.ItemTemplate>
<DataTemplate>
<!-- What should I put below to replace the inner binding? -->
<CheckBox Content="Binding Mode=OneTime" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
【讨论】:
但 DisplayMemberPath 将为列表中的每个使用相同的属性。我认为他想为每个项目使用另一个属性。我不支持架构,但有可能。 @Catfisherman 添加了代码示例,请查看它是否适合您。如果我理解你的正确,那么这就是要走的路 @Markus:如果您从复选框内容属性中删除内部绑定并将默认路径放在那里(点)并为每种自定义类型创建模板,则代码示例将起作用。那很好,我会将它用作备份解决方案(由于架构/设计的复杂性),以防我找不到更好的解决方案。无论如何,一个可能的解决方案。 @Catfisherman 哎呀,对不起,这是一个错字...愚蠢的复制/粘贴...而且,您可能不会真正得到更好的解决方案,因为这正是 DisplayMemberPath 的用途 @Markus:我的意思是我将放置一个数据模板(创建复选框)或 DisplayMemberPath(实际上显示文本)。在我尝试输入此代码后,出现以下错误:“无法同时设置 DisplayMemberPath 和 ItemTemplate。”我想我要么为列表中的每个自定义容器使用数据模板,要么需要找到另一个解决方案。我想避免使用前一种,因为我可能不知道将使用哪种用户容器类型。【参考方案3】:只需将您的行替换为:
<CheckBox Content="Binding ItemPropertyName" />
【讨论】:
这会将内容绑定到 ItemPropertyName 依赖属性。我想绑定一个名称由另一个 DP 指定的 DP。以上是关于定义要绑定的自定义属性的主要内容,如果未能解决你的问题,请参考以下文章