c# - XAML 和 IValueConverter - 首先转换为复杂对象,然后绑定(bind)到结果的属性路径

标签 c# wpf xaml data-binding

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

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
}

然后,我想使用生成的 IVisible-object 并将其 isVisible-property 数据绑定(bind)到我的样式 setter :

<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 如何将复杂对象转换为基本类型(字符串、 double 等)的示例 - 但我也可以使用它将一个对象转换为另一个不同类型的对象,然后绑定(bind)到其中一个对象它的属性?

除此之外,还有其他办法吗?我考虑过包含另一个 ,但这也没有成功(而且更改整个元素的 DataContext 可能不是很聪明......)。


至于我这样做的原因:这是 AvalonDock 元素的样式解决方案。 不过,我的 View 模型不包含任何 AvalonDock 特定的属性(例如 isVisible),因此我需要单独存储它们,例如在 Dictionary< 对象,IExtendedLayoutInformation > 中。对于数据绑定(bind),我尝试通过在字典中查找将 View 模型 (LayoutAnchorableItem.Model) 转换为 IExtendedLayoutInformation,然后需要绑定(bind)到此 IExtendedLayoutInformation 对象的字段。

最佳答案

您可以将内部绑定(bind)设置为另一个属性,例如 DataContextTag 或自定义附加属性,并将外部绑定(bind)绑定(bind)到它。例如:

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

另一种方法是使用链式转换器 - 就像这个问题中提到的那样:Is there a way to chain multiple value converters in XAML?

关于c# - XAML 和 IValueConverter - 首先转换为复杂对象,然后绑定(bind)到结果的属性路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27375611/

相关文章:

c# - 我应该违反 SOLID 中的 S 还是应该违反 DRY 原则?

WPF:从 DataGrid 复制

c# - 窗口内弹出窗口 : How to block UI thread?

WPF 事件,声明式还是处理程序?

c# - WinForms ToolStrip 在视觉继承中不可用

c# - 不可发音成员 ''不能像方法一样使用

c# - 如何加快 Raven DB 查询性能?

C# Datagrid(不是datagridview): how to sort a column of numbers since all values are stored as Text?

.net - 在 XAML 中嵌入 System.String

c# - 使用 Caliburn.Micro 附加到多个事件