Определите пользовательское свойство для привязки к - PullRequest
0 голосов
/ 21 марта 2011

Можно ли привязать элементы элемента управления в пользовательском элементе управления к свойству, имя которого указывается с помощью привязки?

Как-то так, но без выданной ошибки:


    <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, котороедолжен отображаться как текст флажка
  • 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, потребляющего пользовательский элемент управления.

Ответы [ 3 ]

1 голос
/ 21 марта 2011

вы пытались использовать 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>
0 голосов
/ 21 марта 2011

Просто замените вашу строку на:

<CheckBox Content="{Binding ItemPropertyName}" />
0 голосов
/ 21 марта 2011

Можно использовать ValueConverter с ConverterParameter в качестве имени свойства.В реализации ValueConverter вы можете загрузить Value with Reflection.

, конвертер может выглядеть примерно так:

[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;
    }
}
  • добавить обработку ошибок ...
...