是否可以将用户控件中控件的项绑定到通过绑定指定名称的属性?
像这样,但没有产生错误:
<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中设置。
答案 0 :(得分:1)
您是否尝试过使用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>
答案 1 :(得分:0)
可能的情况是使用ValueConverter和ConverterParameter作为Property的名称。在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;
}
}
答案 2 :(得分:0)
只需用以下内容替换您的行:
<CheckBox Content="{Binding ItemPropertyName}" />