定义要绑定到的自定义属性

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

像这样的东西,但没有产生错误:


    <ItemsControl ItemsSource='{Binding Path=CheckListItems, ElementName=Root}'>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <!-- What should I put below to replace the inner binding? -->
                <CheckBox Content='{Binding Path={Binding Path=ItemPropertyName, ElementName=Root}, Mode=OneTime}' />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

哪里

  • CheckListItems (DP)是项目的集合(IList<SomeCustomContainerType>)
  • ItemPropertyName (DP)是SomeCustomContainerType中属性的SomeCustomContainerType ,应该显示为复选框文本
  • Root是用户控件的名称
  • 在这种情况下的例外是(预计)如下:

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

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


    你有没有试过使用DisplayMemberPath?

    这里是一个如何使用它的例子

    试试这个,看看它是否有效:

    <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>
    

    一种可能性是将ValueConverter与ConverterParameter一起用作属性的名称。 在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;
        }
    }
    
  • 添加错误处理...

  • 简单地用你的线代替:

    <CheckBox Content="{Binding ItemPropertyName}" />
    
    链接地址: http://www.djcxy.com/p/7757.html

    上一篇: Define a custom property to bind to

    下一篇: Silverlight DataGrid.Celltemplate Binding to ViewModel