我的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代码,所以一个更好的主意是使用一个BooleanToVisibilityConverter到Bind的Visibility属性bool值@Highcore建议.您可以在StackOverflow上的ViewModel post 中将BOL一个按钮可见性绑定到bool值中看到此示例.
在我看来,更好的解决方案是简单地为每个视图模型提供一个视图.
| 归档时间: |
|
| 查看次数: |
22516 次 |
| 最近记录: |