定义要绑定的自定义属性

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。

以上是关于定义要绑定的自定义属性的主要内容,如果未能解决你的问题,请参考以下文章

具有属性绑定的自定义 UserControl 模板

从代码绑定到 WinRT/UWP 中的自定义附加属性

UITableView的自定义以及自适应高度

属性的自定义配置绑定器

使用 ControlTemplate 在用户控件上绑定自定义依赖属性

Kotlin 2路绑定自定义视图