【问题标题】:Define a custom property to bind to定义要绑定的自定义属性
【发布时间】:2011-07-19 18:41:03
【问题描述】:

是否可以将用户控件中的控件项绑定到通过绑定指定名称的属性?

类似这样,但没有产生错误:

数据模板>

在哪里

  • CheckListItems (DP) 是项目集合(IList<SomeCustomContainerType>)
  • ItemPropertyName (DP) 是 SomeCustomContainerType 中的属性名称,应显示为复选框文本
  • Root 是用户控件的名称

这种情况下的例外情况(预期)如下:

不能在“绑定”类型的“路径”属性上设置“绑定”。 只能在 DependencyObject 的 DependencyProperty 上设置“绑定”。

基本上我想从外部传递属性名称,其文本应以某种方式显示在复选框中。它不必是可绑定的,但应该可以通过使用用户控件的 XAML 进行设置。

【问题讨论】:

    标签: wpf user-controls binding


    【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 2013-10-16
    • 2010-12-04
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多