将两个元素的可见性绑定到一个属性上。

4

我有两个菜单项元素 - “恢复”和“删除”,它们具有互补的可见性:当一个显示时,另一个隐藏。

在ViewModel的代码中,我定义了一个依赖属性FilesSelectedCanBeUndeleted,如下所示:

private bool _filesSelectedCanBeUndeleted;
public bool FilesSelectedCanBeUndeleted
{
    get
    {
        return _filesSelectedCanBeUndeleted;
    }
    set
    {
        _filesSelectedCanBeUndeleted = value;
        OnPropertyChanged("FilesSelectedCanBeUndeleted");
    }
}

Undelete按钮的XAML如下所示:
<MenuItem Header="Undelete" Command="{Binding UndeleteCommand }" 
Visibility="{Binding Path=FilesSelectedCanBeUndeleted, 
Converter={StaticResource BoolToVisConverter}}" >

正如您所看到的,"可恢复删除的文件"的可见性与FilesSelectedCanBeUndeleted属性绑定(借助于BooleanToVisibilityConveter)。

现在我的问题是,我该如何编写XAML将“删除”按钮的可见性绑定到FilesSelectedCanBeUndeleted属性的“NOT”值?

谢谢。

4个回答

5

这里是一个自定义的IValueConverter示例,它允许您反转可见性逻辑。基本上,当视图模型属性为true时,一个MenuItem将可见,而另一个将折叠。

因此,您需要像这样定义两个转换器实例:

<local:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
<local:BooleanToVisibilityConverter x:Key="ReversedBooleanToVisibilityConverter" IsReversed="true" />

3
您可以将datatrigger应用于您的菜单项,以避免在您的视图模型中使用另一个属性,如下所示 -
        <MenuItem Header="Delete"
                  Command="{Binding DeleteCommand }">
            <MenuItem.Style>
                <Style TargetType="{x:Type MenuItem}">
                    <Setter Property="Visibility" Value="Visible" />
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding FilesSelectedCanBeUndeleted}" Value="False">
                            <Setter Property="Visibility"
                                    Value="Collapsed" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </MenuItem.Style>
        </MenuItem>

1
在您的ViewModel上创建一个新属性,然后将'FilesSelectedCanBeUndeleted'取反并绑定到它。

是的,这就是我现在正在做的。它可以工作,但我希望能够避免创建一个有些冗余的属性。谢谢。 - sean717

0

我之前用简单的否定做过类似的事情...

    private bool _filesSelectedCanBeUndeleted;
public bool FilesSelectedCanBeUndeleted{    
        get{ 
            return _filesSelectedCanBeUndeleted;    
            }   
        set{        
            _filesSelectedCanBeUndeleted = value;        
            OnPropertyChanged("FilesSelectedCanBeUndeleted");    
            // You have also to notify that the second Prop will change
            OnPropertyChanged("FilesSelectedCanBeDeleted");    
            }}

public bool FilesSelectedCanBeDeleted{
        get{
            return !FilesSelectedCanBeUndeleted;
        }
        }

Xaml 可能会像这样看起来....

<MenuItem Header="Delete" 
    Command="{Binding DeleteCommand }" 
    Visibility="{Binding Path=FilesSelectedCanBeDeleted, Converter={StaticResource BoolToVisConverter}}" >

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接