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

NZJ*_*mes 11 wpf binding mvvm

我的ResultView中有一个带有六个选项卡的TabControl.位于此View后面的ViewModel可以是ResultTypeOneViewModel或ResultTypeTwoViewModel,每个ViewModel都派生自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...
Run Code Online (Sandbox Code Playgroud)

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

public abstract Visibility IsTabVisible(int index);
Run Code Online (Sandbox Code Playgroud)

并且在ResultsOneViewModel中有

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

并且在ResultsTwoViewModel中有

public override Visibility IsTabVisible(int index)
{
    if (index == 0) return Visibility.Hidden;
    return Visibility.Visible;
}
Run Code Online (Sandbox Code Playgroud)

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

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

She*_*dan 10

要直接回答您的问题,您可以使用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>
Run Code Online (Sandbox Code Playgroud)

然后你应该能够像这样访问结果(但是你需要其中一个TabItem):

<TabItem Visibility="{Binding Source={StaticResource IsTab1VisibleMethod}}" />
Run Code Online (Sandbox Code Playgroud)

然而,这通常不是好的做法来操作UI特性,例如Visibility代码,所以一个更好的主意是使用一个BooleanToVisibilityConverterBindVisibility属性bool值@Highcore建议.您可以在StackOverflow上的ViewModel post 中将BOL一个按钮可见性绑定到bool值中看到此示例.

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