Как привязать к свойству Metro Flyout ItemContainerStyle кнопку в RightWindowCommands?

Я работаю над решением этого вопроса в качестве основы для моей текущей попытки управлять открытие и закрытие всплывающего окна Metro. Разница в том, что у меня есть ToggleButton, определенный в RightWindowCommands. Желаемое поведение состоит в том, что IsCheckedstatus этой кнопки должен быть привязан к свойству IsOpen базовой модели всплывающего представления.

Это XAML с некоторыми из моих неудачных попыток:

<controls:MetroWindow.Flyouts>
    <controls:FlyoutsControl x:Name="FlyoutsControl" >
        <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 IsOpen}" />
                <Setter Property="Position" Value="{Binding Position}" />
                <Setter Property="Theme" Value="Accent" />
            </Style>
        </controls:FlyoutsControl.ItemContainerStyle>
        <controls:FlyoutsControl.ItemTemplate>
            <DataTemplate DataType="{x:Type local:SettingsFlyoutViewModel}">
                <local:SettingsFlyoutView x:Name="SettingsFlyoutView"/>
            </DataTemplate>
        </controls:FlyoutsControl.ItemTemplate>
    </controls:FlyoutsControl>
</controls:MetroWindow.Flyouts>
<controls:MetroWindow.RightWindowCommands>
    <controls:WindowCommands>
<!--<ToggleButton Content="{iconPacks:FontAwesome Kind=FighterJetSolid}" Background="{DynamicResource AccentColorBrush}" ToolTip="Toggle flyout." BorderBrush="White" BorderThickness="1" IsChecked="{Binding ElementName=SettingsFlyoutView, Path=IsOpen}" Cursor="Hand"/>-->
        <!--<ToggleButton Content="{iconPacks:FontAwesome Kind=FighterJetSolid}" Background="{DynamicResource AccentColorBrush}" ToolTip="Toggle flyout." BorderBrush="White" BorderThickness="1" 
                      IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type controls:MetroWindow}}, Path=IsOpen}"/>-->
        <!--<ToggleButton Content="{iconPacks:FontAwesome Kind=FighterJetSolid}" Background="{DynamicResource AccentColorBrush}" ToolTip="Toggle flyout." BorderBrush="White" BorderThickness="1" 
                      IsChecked="{Binding ElementName=FlyoutsControl, Path=DataContext.IsOpen}"/>-->
        <!--<ToggleButton Content="{iconPacks:FontAwesome Kind=FighterJetSolid}" Background="{DynamicResource AccentColorBrush}" ToolTip="Toggle flyout." BorderBrush="White" BorderThickness="1" 
                      IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type controls:Flyout}}, Path=IsOpen}"/>-->
    </controls:WindowCommands>
</controls:MetroWindow.RightWindowCommands>

What is the right binding strategy to bind IsChecked to IsOpen?


person ket    schedule 21.11.2018    source источник
comment
Как определить базовый всплывающий элемент для конкретной кнопки?   -  person mm8    schedule 22.11.2018
comment
@mm8 мм8 Хороший вопрос - я отредактировал свой вопрос, включив ранее пропущенный ItemTemplate. Здесь SettingsFlyoutView — это пользовательский элемент управления, который использует SettingsFlyoutViewModel в качестве резервной модели представления. У меня все еще возникают трудности с привязкой; см. новейшую попытку в верхней части комментируемого раздела. Что мне не хватает?   -  person ket    schedule 26.11.2018


Ответы (1)


Ну вот

<Controls:MetroWindow.Flyouts>
    <Controls:FlyoutsControl>
        <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 IsOpen}" />
                <Setter Property="Position" Value="{Binding Position}" />
                <Setter Property="Theme" Value="Accent" />
            </Style>
        </Controls:FlyoutsControl.ItemContainerStyle>
        <Controls:Flyout x:Name="yourMahAppFlyout" Header="Flyout" Position="Right" Width="200">
            <!-- Your custom content here -->
        </Controls:Flyout>
    </Controls:FlyoutsControl>
</Controls:MetroWindow.Flyouts>
<Controls:MetroWindow.RightWindowCommands>
    <Controls:WindowCommands>
        <ToggleButton Content="{iconPacks:FontAwesome Kind=FighterJetSolid}" Background="{DynamicResource AccentColorBrush}" ToolTip="Toggle flyout." BorderBrush="White" BorderThickness="1" 
                  IsChecked="{Binding ElementName=yourMahAppFlyout, Path=IsOpen}" Cursor="Hand"/>
    </Controls:WindowCommands>
</Controls:MetroWindow.RightWindowCommands>
person Cinchoo    schedule 22.11.2018
comment
Когда я добавляю элемент строки <Controls:Flyout>, я получаю исключение времени выполнения Items collection must be empty before using ItemsSource. Одно различие между моим сценарием и фрагментом веб-сайта Mahapps заключается в том, что в их примере не используется ItemContainerStyle, который, как мне кажется, мне нужен для привязки к свойствам моей модели представления на основе ссылки вверху. Любые мысли, как разрешить исключение? - person ket; 26.11.2018
comment
Я не могу воспроизвести вашу проблему. Можете ли вы опубликовать свой пример кода, чтобы посмотреть на него? - person Cinchoo; 26.11.2018
comment
Я разместил копию проекта, так как он выдает исключение здесь: 1drv.ms/f/s!AsvM6Pyke4A6hCRyovosrs0kIKGG, указанное выше содержимое можно найти в файле MainWindow.xaml. - person ket; 27.11.2018