MahApp Flyout CloseCommand和IsOpen没有正确绑定

时间:2015-04-26 06:16:22

标签: c# wpf mvvm mahapps.metro

我遵循严格的MVVM模式。

在我的FlyoutControl中,我已经约束了以下内容:

    <controls:FlyoutsControl>
        <controls:Flyout IsOpen="{Binding FlyoutIsOpen, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
                         CloseCommand="{Binding CloseFlyoutCommand}">
            ...
        </controls:Flyout>
    </controls:FlyoutsControl>

我有两种情况,都不起作用:

情景1:

  

我在FlyoutIsOpen构造函数中将true设置为ViewModel,并将CloseFlyoutCommand绑定到DelegateCommand,该FlyoutIsOpen接受设置{{1}的方法转到false

在这种情况下,我的视图加载Flyout已经打开(正如预期的那样)。但是,当我单击Flyout关闭按钮时,除非我再次单击它,否则没有任何反应。如果我打印方法的输出,我可以确认该命令将FlyoutIsOpen设置为false,但出于某种原因,我需要再次点击(FlyoutIsOpen设置为{{之后) 1}})实际关闭false

情景2:

  

我在构造函数中将Flyout设置为FlyoutIsOpen(或未初始化)。我将另一个按钮绑定到false,该按钮接受将DelegateCommand设置为FlyoutIsOpen的方法。

视图在true关闭时加载(如预期的那样)。但是,当我点击一个我已绑定到将Flyout设置为FlyoutIsOpen的方法的按钮时,没有任何操作,并且true没有出现。

有没有人遇到Flyout类似的无响应问题?如果是这样,你是如何解决的?

1 个答案:

答案 0 :(得分:0)

我也遇到了绑定isOpen属性的问题,但我通过在ItemContainer设置样式并绑定IsOpen而不是在Flyout内进行设置。我甚至不需要CloseCommand,在我的视图模型中将Visible设置为false会关闭弹出按钮。

我定义MainWindow.xaml绑定的ItemContainer

<controls:MetroWindow.Flyouts>
    <controls:FlyoutsControl ItemsSource="{Binding Flyouts}">
        <controls:FlyoutsControl.Resources>
            <view:FlyoutPositionConverter x:Key="FlyoutPositionConverter"/>
        </controls:FlyoutsControl.Resources>
        <controls:FlyoutsControl.ItemTemplate>
            <DataTemplate DataType="{x:Type viewModel:SettingsViewModel}">
                <view:SettingsFlyout/>
            </DataTemplate>
        </controls:FlyoutsControl.ItemTemplate>
        <controls:FlyoutsControl.ItemContainerStyle>
            <Style BasedOn="{StaticResource {x:Type controls:Flyout}}"
               TargetType="{x:Type controls:Flyout}">
                <Setter Property="Header"
                    Value="{Binding Header}" />
                <Setter Property="IsOpen"
                    Value="{Binding Visible}" />
                <Setter Property="Position"
                    Value="{Binding Position, Converter={StaticResource FlyoutPositionConverter}}" />
                <Setter Property="IsModal"
                    Value="{Binding IsModal}" />
                <Setter Property="Theme" Value="Accent" />
            </Style>
        </controls:FlyoutsControl.ItemContainerStyle>
    </controls:FlyoutsControl>
</controls:MetroWindow.Flyouts>

mainviewmodel有一个名为ObservableCollection<IFlyoutViewModel>的{​​{1}},其中包含我的所有弹出视图模型。他们当然必须实施Flyouts

IFlyoutViewModel

using System.ComponentModel; namespace MyApplication.ViewModel { internal interface IFlyoutViewModel : INotifyPropertyChanged { string Header { get; } bool Visible { get; set; } Position Position { get; set; } bool IsModal { get; set; } } public enum Position { Top, Left, Right, Bottom } } 只是我的位置枚举和FlyoutPositionConverter之间的映射器,因为我不想在我的viewmodel界面中使用真正的位置。