您的视图模型的Editor 属性是控件吗?我希望不会,但无论如何。
您可以编写一个返回值类型的值转换器,然后通过样式中的一系列触发器设置标签的内容。如果编辑器的类型是{x:Type TextBox},请将其设置为您在上面得到的绑定。如果是{x:Type CheckBox},则设为`{Binding Editor.IsChecked}'。
XAML
<Label>
<Label.Style>
<Style TargetType="Label" BasedOn="{StaticResource {x:Type Label}}">
<Style.Triggers>
<DataTrigger
Binding="{Binding ElementName=Editor, Converter={local:GetTypeConverter}}"
Value="{x:Type TextBox}"
>
<Setter
Property="Content"
Value="{Binding Text.Length, ElementName=Editor}"
/>
</DataTrigger>
<DataTrigger
Binding="{Binding ElementName=Editor, Converter={local:GetTypeConverter}}"
Value="{x:Type CheckBox}"
>
<Setter
Property="Content"
Value="{Binding IsChecked, ElementName=Editor}"
/>
</DataTrigger>
</Style.Triggers>
</Style>
</Label.Style>
</Label>
C#
public class GetTypeConverter : MarkupExtension, IValueConverter
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value?.GetType();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
或者,您的视图模型可以具有一个只读属性,该属性返回该标签中应包含的任何内容,因为该视图模型具有 Editor 并且知道它是什么。暂时叫它EditorLabelValue。大概Editor 绑定到string 属性或bool 属性,这取决于它是哪个编辑器。所以这两个设置器都会为"EditorLabelValue" 提高PropertyChanged,这将返回适当的值。
我尝试在纯 XAML 中执行此操作,方法是将 Editor 设为 ContentControl 的 Content,然后使用 DataTemplates,但我无法找到一种方法来完成这项工作,而不会出现重设 @ 的例外情况987654336@。