C# 是否将XAML中的按钮可见性绑定到viewmodel?

C# 是否将XAML中的按钮可见性绑定到viewmodel?,c#,xamarin,mvvm,xamarin.forms,xamarin-studio,C#,Xamarin,Mvvm,Xamarin.forms,Xamarin Studio,我希望按钮在状态下可见。远离和状态。停止但由于某种原因,即使状态与状态.远离和状态.停止不同,按钮也始终可见 Xaml: <Button Text="Hello" IsVisible="{Binding View}"/> private bool myBool; public bool View { get { if (State == State.Away || State == State.Gone) {

我希望按钮在
状态下可见。远离
状态。停止
但由于某种原因,即使
状态
状态.远离
状态.停止
不同,按钮也始终可见

Xaml:

<Button Text="Hello" IsVisible="{Binding View}"/>
private bool myBool;

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

您可以创建一个从
状态
可见性

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}}"/>


如果始终返回false,当View Changes的值为按钮不可见时,VM需要实现INotifyPropertyChanged并引发PropertyChanged事件?然后,绑定可能不知道“状态”改变时“视图”发生了变化。此外,请确保控件的DATACONTRONT设置为VIEW模型正确。我将使用<代码> IValueConverter < /代码>将绑定<代码> ISTABLE 直接考虑到<代码>状态>代码>,它知道如何将状态映射到所需的可视性。这样,您就不必担心在多个属性上引发
PropertyChanged
,并且您可以完全摆脱
View
,从而简化代码。您可能需要基于现有代码包含一些名称空间。如果您的实际代码与示例代码不完全匹配,则可能是他弄错了一些类名。但从高层次来看,这一切都是正确和完整的。