如何在XAML中将按钮的可见性绑定到视图模型?

4

我希望在State.AwayState.Stop状态下按钮可见,但出现了问题,即使StateState.AwayState.Stop不同,该按钮仍然可见。

Xaml:

<Button Text="Hello" IsVisible="{Binding View}"/>

ViewModel:

private bool myBool;

public bool View
{
    get
    {
        if (State == State.Away || State == State.Gone)
        {
            myBool = true;
        }
        else
        {
            myBool = false;                   
        }
        return myBool;
    }
}

2
你的虚拟机需要实现INotifyPropertyChanged接口,并在View的值更改时引发PropertyChanged事件。 - Jason
如果您始终返回false,按钮是否不可见?那么绑定可能不知道当“状态”更改时“视图”已更改。 - Alex AIT
此外,请确保控件的DataContext正确设置为您的ViewModel。 - Viju
1
我会考虑使用一个 IValueConverter 直接将 IsVisible 绑定到 State,该转换器知道如何将状态映射到所需的可见性。这样,您就不必担心在多个属性上触发 PropertyChanged,并且可以完全摆脱 View,简化代码。 - Bradley Uffner
https://stackoverflow.com/questions/26924718/ivalueconverter-and-visibility - user1228
1个回答

2
您可以创建一个从StateVisibilityIValueConverter
public class StateToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
            System.Globalization.CultureInfo culture)
    {
        if (value is State)
        {
            State state = (State)value;
            switch (state)
            {
                case State.Away:
                case State.Gone:
                    return Visibility.Visible;
                default:
                    return Visibility.Collapsed;
            }
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, 
            System.Globalization.CultureInfo culture)
    {
        return State.None; // your default state
    }
}

然后你将按钮绑定到转换器。
<Window.Resources>
    <local:StateToVisibilityConverter x:Key="StateToVisibilityConverter"/>
</Window.Resources>

<Button Text="Hello" Visibility="{Binding Path=State, Converter={StaticResource StateToVisibilityConverter}}"/>

根据您现有的代码,您可能需要包含一些名称空间。如果您的真实代码与示例代码不完全相符,则可能会出现一些类名错误。但从高层次来看,这是全部正确和完整的。 - Bradley Uffner

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