C# XAML&;IValueConverter-首先转换为复杂对象,然后绑定到结果的属性路径

C# XAML&;IValueConverter-首先转换为复杂对象,然后绑定到结果的属性路径,c#,wpf,xaml,data-binding,C#,Wpf,Xaml,Data Binding,我正在使用XAML为“LayoutAchorableItem”类型的对象设置样式。 此类包含类型为object的属性“Model”。我想使用IValueConverter将其转换为XAML中的IVible类型: public class LayoutAnchorableItem { object Model { get; } // .. other properties & methods .. } public interface IVisible { bool isV

我正在使用XAML为“LayoutAchorableItem”类型的对象设置样式。 此类包含类型为object的属性“Model”。我想使用IValueConverter将其转换为XAML中的IVible类型:

public class LayoutAnchorableItem
{
  object Model { get; }
  // .. other properties & methods ..
}


public interface IVisible
{
  bool isVisible { get; set; }
  // .. other properties ..
}

public class ObjectToIVisibleConverter : IValueConverter
{
  // ...
  // "Converts" LayoutAnchorableItem.Model to IVisible by looking up the model's reference in an internal dictionary
}
然后,我想使用生成的IVible对象并将其isVisible属性数据绑定到我的样式设置器:

<ad:DockingManager.LayoutItemContainerStyleSelector>
    <view:PanesStyleSelector>
        <view:PanesStyleSelector.ToolStyle>
            <Style TargetType="{x:Type ad:LayoutAnchorableItem}">

        <!-- PSEUDO-CODE! I cant use {Binding ...} inside a {Binding ...} -->
                <Setter Property="Visibility" Value="{Binding {Binding Model, Converter={StaticResource ObjectToIVisibleConverter}}.isVisible, Converter={StaticResource BoolToVisibilityConverter}}"/>

            </Style>
        </view:PanesStyleSelector.ToolStyle>
    </view:PanesStyleSelector>
</ad:DockingManager.LayoutItemContainerStyleSelector>

但是如何在XAML中实现这一点

我只见过IValueConverters如何将复杂对象转换为基本类型(字符串、双精度等)的示例,但我是否也可以使用它将对象转换为另一个不同类型的对象,然后绑定到其属性之一

否则,还有其他办法吗?我曾考虑过包含另一个元素,但也没有成功(加上更改整个元素的DataContext可能不是很明智…)


至于我为什么要这样做:这是一个阿瓦隆托克元素风格的定居者。
但是,我的视图模型不包含任何特定于AvalonDock的属性(例如isVisible),因此我需要单独存储它们,例如,在字典中。对于数据绑定,我试图通过在字典中查找来将viewmodel(LayoutOnCallableItem.Model)转换为IExtendedLayoutFormation,然后需要绑定到此IExtendedLayoutFormation对象的字段。

您可以将内部绑定设置为另一个属性,如
DataContext
标记
,或自定义附加属性,并将外部绑定绑定到该属性。例如:

<Setter Property="Tag"
        Value="{Binding Model, Converter={StaticResource ObjectToIVisibleConverter}}"/>
<Setter Property="Visibility"
        Value="{Binding Tag.isVisible, RelativeSource={RelativeSource Self}, Converter={StaticResource BoolToVisibilityConverter}}"/>


另一种方法是使用链式转换器,类似于本问题中提到的转换器:

为什么不直接转换为
可见性
,而不是
IVisible
?转换器可能就是您的IVible实现所做的。谢谢-问题是,有许多扩展属性,而不仅仅是可见的-所以我需要为每个属性创建转换器(有点烦人)。另外,可以想象,这可能会导致双向绑定出现问题-例如,无法仅将bool转换回适当的IExtendedLayoutInformation对象,而不找到存储和传递附加信息(例如对视图模型的引用)的方法,多亏了大量Adi!我已经处理这个问题好几天了。。您的解决方案工作得非常出色,代码也非常清晰易读。。再好不过了!谢谢,很高兴我能帮上忙。事实上,我面临的唯一问题是,当底层对象(Tag.isVisisble)改变时,“可见性”不会改变。或者更确切地说:当我直接绑定到Tag.isVisible时,所有的更改都能很好地传递,但是一旦我将BooltVisibilityConverter应用到它,更改就不会传递。这很奇怪。。如果你能自发地想到一个原因,当然要感谢另一个输入!我将继续研究自己,尝试将
BoolToVisibilityConverter
制作成一个多值转换器,并将
Tag
Tag.isVisible
绑定到它。为了进行测试,我现在直接公开了类型为“Visibility”的isVisible,以避免转换。当我将其绑定到AvalonDock的LayoutAcholableItem(由其LayoutItem继承)类公开的(string)“Title”属性时,这一切都可以正常工作。但是当绑定到同一类的“可见性”属性(由LayoutItem-FrameworkElement-UIElement继承)时,它不会随更改而更新。然而,当绑定到ItemsControl中的普通标签样式的可见性属性时,它仍然可以正常工作。必须多做研究,根本不知道这里发生了什么。。。