我遵循严格的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
类似的无响应问题?如果是这样,你是如何解决的?
答案 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界面中使用真正的位置。