MVVM + WPF + Всплывающее окно = невежественный

Я все еще работаю над изменением моего существующего приложения WPF, чтобы быть "совместимым" с подходом MVVM. Я получаю симпатичное проклятое завершение, но не уверен, как решить одно из оставления немногими препятствиями.

У меня есть элемент GUI (в настоящее время кнопка, хотя это могла быть маркировка), где, когда мышь вводит его, это запускает Событие MouseEnter, и это создает всплывающее окно в коде - позади. Всплывающее окно состоит из простого stackpanel расположения с несколькими кнопками. Событие Click каждой кнопки в настоящее время присваивается тому же обработчику событий, за исключением того, что я изменяю Свойство тегов, чтобы сделать простой (дрянной) параметр команды. Я борюсь с "корректным" способом сделать это в MVVM, потому что способ, которым я делаю его теперь, довольно ужасен.

Для решения этого я думаю, что это - направление, которое я должен возглавить в, но ценил бы любой дополнительный вход, который можно предложить мне.:)

  1. Создайте Всплывающее окно в XAML. Так как мое Раскрывающееся содержание статично, я должен быть в состоянии создать Всплывающее окно полностью в XAML. Кроме того, каждая кнопка была бы связана с тем же ICommand-производным-классом. например.

    <Popup x:Key="MyPopup" StaysOpen="False" Placement="Right">
        <Border Background="White" BorderBrush="Black" Padding="5" BorderThickness="2" CornerRadius="5">
            <StackPanel Orientation="Vertical">
                <Button Command="{Binding MyCommand}" CommandParameter="5">5</Button>
                <Button Command="{Binding MyCommand}" CommandParameter="10">10</Button>
                <Button Command="{Binding MyCommand}" CommandParameter="15">15</Button>
                <Button Command="{Binding MyCommand}" CommandParameter="20">20</Button>
            </StackPanel>
        </Border>
    </Popup>
    
  2. Сделайте Раскрывающееся всплывающее окно через Триггер, например.

                            <Button.Triggers>
                                <Trigger Property="Button.IsMouseOver" Value="True">
                                    <Setter TargetName="MyPopup" Property="IsOpen" Value="True" />
                                </Trigger>
                            </Button.Triggers>
    

Я думаю, что № 1 в порядке, но я борюсь с № 2. Действительно ли это - правильный способ приблизиться к проблеме? И если так, каков корректный синтаксис XAML для того, чтобы заставлять свойство Popup's IsOpen иметь значение true? Я не мог найти примеры для этого.

Если мои целые взгляды испорчены, я хотел бы услышать, каковы мои другие опции. Спасибо!

21
задан Dave 4 January 2010 в 06:54
поделиться

1 ответ

Вот что я сделаю, сначала я разобью свои многоразовые части на ресурсы, и буду ссылаться на них, используя ContentControls в XAML. Это относится к Popup, а также к кнопке Button. Однако я не хочу ограничиваться только кнопкой, поэтому я буду использовать ContentControl и для этого:

Всплывающее окно:

<ControlTemplate x:Key="PopupTemplate">
    <Border 
                Background="White" 
                BorderBrush="Black" 
                Padding="5" 
                BorderThickness="2" 
                CornerRadius="5">
        <StackPanel Orientation="Vertical">
            <Button Command="{Binding MyCommand}" 
                            CommandParameter="5">5</Button>
            <Button Command="{Binding MyCommand}" 
                            CommandParameter="10">10</Button>
            <Button Command="{Binding MyCommand}" 
                            CommandParameter="15">15</Button>
            <Button Command="{Binding MyCommand}" 
                            CommandParameter="20">20</Button>
        </StackPanel>
    </Border>
</ControlTemplate>

Шаблон ContentControl:

<ControlTemplate x:Key="MyControlTemplate" TargetType="ContentControl">
    <Grid Name="MyControl">
        <ContentPresenter Content="{TemplateBinding Content}"/>
        <Popup Name="MyPopup" StaysOpen="True" Placement="Bottom">
            <ContentControl Template="{StaticResource PopupTemplate}"/>
        </Popup>
    </Grid>
    <ControlTemplate.Triggers>
        <Trigger SourceName="MyControl" 
                 Property="UIElement.IsMouseOver" 
                 Value="True">
            <Setter TargetName="MyPopup" 
                    Property="Popup.IsOpen" 
                    Value="True"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

Теперь в главном окне XAML я создам следующее:

<ContentControl Template="{StaticResource MyControlTemplate}">
    <Button Content="Test"/>
</ContentControl>

Если у вас есть вопросы, я с удовольствием отвечу на них.

.
19
ответ дан 29 November 2019 в 21:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: