MahApp Flyout CloseCommand and IsOpen are not bound properly
I am following the strict MVVM schema.
In mine, FlyoutControl
I have linked the following:
<controls:FlyoutsControl>
<controls:Flyout IsOpen="{Binding FlyoutIsOpen, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
CloseCommand="{Binding CloseFlyoutCommand}">
...
</controls:Flyout>
</controls:FlyoutsControl>
I have two scripts both of which are not working:
Scenario 1:
I set
FlyoutIsOpen
totrue
in my constructorViewModel
, and I bindCloseFlyoutCommand
toDelegateCommand
, which takes a method that setsFlyoutIsOpen
tofalse
.
In this case, my view is loaded with it Flyout
already open (as expected). However, when I click the Flyout
close button , nothing happens unless I click again. If I print the output of my method, I can confirm that the command is setting FlyoutIsOpen
to false
, but for some reason I need a second click (after being FlyoutIsOpen
set to false
) to actually close Flyout
.
Scenario 2:
I have set
FlyoutIsOpen
tofalse
(or uninitialized) in my constructor. I am binding another button toDelegateCommand
that takes a method that setsFlyoutIsOpen
intrue
.
The view is loaded with closed Flyout
(as expected). However, when I click on the button associated with the method that sets FlyoutIsOpen
in true
, nothing happens and Flyout
does not appear.
Has anyone faced the same unresponsive issues with FlyoutsControl
? If so, how did you resolve it?
source to share
I also had problems binding to the property isOpen
, but I managed to style ItemContainer
and bind isOpen
there instead of inside mine Flyout
. I don't need it anymore CloseCommand
, setting Visible
to false in my viewmodel closes the popup.
MainWindow.xaml
where I define the bindings 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>
The mainviewmodel is ObservableCollection<IFlyoutViewModel>
named Flyouts
and contains all my viewtodels to fly out. Of course they have to implement 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
- it's just a mapping between my position enum and MahApps.Metro.Controls.Position
because I didn't want to use real positon in my viewmodel interface.
source to share