【问题标题】:I can't hide the window in MVVM我无法在 MVVM 中隐藏窗口
【发布时间】:2017-05-15 20:20:59
【问题描述】:

我在 WPF 应用程序中有启动窗口,并且在我的视图中有这段代码:

     <Window x:Class="MyView"
                Name="ucPrincipal"
                Title="{Binding Titulo}"
                Visibility="{Binding EsUpdaterVisible, Mode=TwoWay}">

    <Window.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="../Recursos/Diccionarios/Converters.xaml" />
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Window.Resources>

<Button Content="Aceptar" HorizontalAlignment="Left" Margin="10,145,0,0" VerticalAlignment="Top" Width="75">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="PreviewMouseLeftButtonDown">
                    <cmd:EventToCommand Command="{Binding AceptarCommand}" PassEventArgsToCommand="True" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>

我的视图模型:

private RelayCommand _aceptarCommand;
        public RelayCommand AceptarCommand
        {
            get { return _aceptarCommand ?? (_aceptarCommand = new RelayCommand(aceptarCommand)); }
        }


        private void aceptarCommand()
        {
            try
            {
                EsUpdaterVisible = false;

                Titulo = "Después de aceptar.";
            }
            catch { throw; }
        }



private bool _esUpdaterVisible = true;
        public bool EsUpdaterVisible
        {
            get { return _esUpdaterVisible; }
            set
            {
                if (_esUpdaterVisible != value)
                {
                    _esUpdaterVisible = value;
                    base.RaisePropertyChangedEvent("EsUpdaterVisible");
                }
            }
        }


        private string _titulo = "Inicio";
        public string Titulo
        {
            get { return _titulo; }
            set
            {
                if (_titulo != value)
                {
                    _titulo = value;
                    base.RaisePropertyChangedEvent("Titulo");
                }
            }
        }

当我单击 aceptar 按钮时,窗口的标题发生了变化,但窗口仍然可见。

在某些情况下,我想从视图模型中隐藏窗口。我怎么能这样做?

谢谢。

【问题讨论】:

  • 您的 EsUpdaterVisible 是 bool 类型,但您绑定的 Window.Visibility 属性是 Visibility 类型。
  • 我已将类型从 bool 更改为 Visibility(System.Windows 枚举)。但是 With Visibility.Hidden 不会隐藏窗口。

标签: c# wpf mvvm


【解决方案1】:

如果您不想使用转换器,只需 xaml 部分:

<Window x:Class="MyView"
            Name="ucPrincipal"
            Title="{Binding Titulo}">
    <Window.Style>
       <Style TargetType="Window">
            <Style.Triggers>
                <DataTrigger Binding="{Binding EsUpdaterVisible,UpdateSourceTrigger=PropertyChanged}" Value="True">
                     <Setter Property="Visibility" Value="Visible"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding EsUpdaterVisible,UpdateSourceTrigger=PropertyChanged}" Value="False">
                     <Setter Property="Visibility" Value="Collapsed"/> <!-- use hide instead of collapsed if you would like to open again this instance of window after close. -->
                </DataTrigger>
            </Style.Triggers>
       </Style>
    </Window.Style>

【讨论】:

    【解决方案2】:

    可见性不是布尔类型。 您可以使用转换器来完成此操作。 转换器:

    [ValueConversion(typeof(bool), typeof(Visibility))]
    public class VisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return (bool)value ? Visibility.Visible : Visibility.Collapsed;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    你的 XAML 看起来像这样:

    <Window x:Class="MyView"
                    Name="ucPrincipal"
                    Title="{Binding Titulo}"
                    Visibility="{Binding EsUpdaterVisible, Converter={StaticResource visibilityConverter}}">
    

    【讨论】:

    • Visibility="{Binding EsUpdaterVisible, Mode=TwoWay, Converter={StaticResource BooleanToVisibilityConverter}}" 行出现错误
    • 当转换器没有实现ConvertBack时,为什么要使用双向绑定?
    • StaticResourceExtension 异常的错误。我试过去掉双向模式,但错误是一样的。
    • 我已经将转换器模式转换为 app.axml,所以我更正了问题,但是,窗口仍然没有隐藏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 2020-11-28
    • 2019-06-23
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多