使用 ViewModel 中的多态性绑定到 XAML 中带有参数的方法

2024-04-06

我的 ResultView 中有一个带有六个选项卡的 TabControl。位于此视图后面的 ViewModel 可以是 ResultTypeOneViewModel 或 ResultTypeTwoViewModel,它们均派生自 ResultViewModel,但您可以将结果查看器与任一结果类型互换使用。

不同之处在于,在 ResultTypeOneViewModel 中,选项卡 1 和 3 需要可见,其余部分需要隐藏。 在 ResultTypeTwoViewModel 中,选项卡 2、3、4、5、6 需要可见,选项卡 1 需要隐藏。

我想通过类似的方式做到这一点

<TabItem Name="1" Visibility={Binding IsTabVisible(0)}>
<TabItem Name="2" Visibility={Binding IsTabVisible(1)}>
<TabItem Name="3" Visibility={Binding IsTabVisible(2)}>
etc...

并在 ResultsViewModel 中有一个抽象方法声明,例如

public abstract Visibility IsTabVisible(int index);

在 ResultsOneViewModel 中有

public override Visibility IsTabVisible(int index)
{
    if (index == 0 || index == 2) return Visibility.Visible;
    return Visibility.Hidden;
}

在 ResultsTwoViewModel 中有

public override Visibility IsTabVisible(int index)
{
    if (index == 0) return Visibility.Hidden;
    return Visibility.Visible;
}

但我无法弄清楚如何通过 WPF XAML 中的绑定使用参数调用这样的方法。

任何人都可以建议我如何做到这一点,或者如果通过这种方法不可能,我可以通过另一种方式解决这个问题?


要直接回答您的问题,您可以使用ObjectDataProvider为您调用一个方法,以便您可以处理结果:

xmlns:System="clr-namespace:System;assembly=mscorlib"
xmlns:Windows="clr-namespace:System.Windows;assembly=PresentationCore"

...

<Window.Resources>
    <ObjectDataProvider x:Key="IsTab1VisibleMethod" 
        ObjectType="{x:Type Windows:Visibility}" IsAsynchronous="True" 
        MethodName="IsTabVisible">
        <ObjectDataProvider.MethodParameters>
            <System:Int32>0</System:Int32>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>

然后您应该能够像这样访问结果(但是您需要为每个TabItem):

<TabItem Visibility="{Binding Source={StaticResource IsTab1VisibleMethod}}" />

然而,操作 UI 属性(例如Visibility在代码中,所以更好的想法是使用BooleanToVisibilityConverter to Bind the Visibility属性到bool@Highcore 建议的值。您可以在以下位置查看此示例将按钮可见性绑定到 ViewModel 中的 bool 值 https://stackoverflow.com/questions/7000819/binding-a-button-visibility-to-bool-value-in-viewmodel在 StackOverflow 上发布。

在我看来,更好的解决方案是简单地为每个视图模型提供一个视图。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ViewModel 中的多态性绑定到 XAML 中带有参数的方法 的相关文章

随机推荐