В WPF MVVM должен участвовать ViewModel в открытии окна, например, About-window? - PullRequest
2 голосов
/ 19 декабря 2010

У меня есть стандартное древовидное представление WPF и связанные элементы для просмотра классов моделей.

Теперь я хочу обработать поведение, когда элементы дважды щелкаются (открытие документов в стиле visual-studio).

Я могу получить обработчик событий для запуска в элементе управления, содержащем древовидное представление (показан xaml), но как мне привязать к определенному поведению на классах модели представления - например, ProjectViewModel?

Предпочтительнее привязать к ICommand-Implementer, как это используется в других местах ...

Спасибо за любые комментарии,

Андерс, Дания

    <TreeView ItemsSource="{Binding Projects}" MouseDoubleClick="TreeView_MouseDoubleClick">
        <TreeView.ItemContainerStyle>
            <!-- 
    This Style binds a TreeViewItem to a TreeViewItemViewModel. 
    -->
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
                <Setter Property="FontWeight" Value="Normal" />
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="FontWeight" Value="Bold" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TreeView.ItemContainerStyle>

        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type Implementations:ProjectViewModel}" ItemsSource="{Binding Children}">
                <StackPanel Orientation="Horizontal">
                    <Image Width="16" Height="16" Margin="3,0" Source="Images\Region.png" />
                    <TextBlock Text="{Binding DisplayName}" />
                </StackPanel>
            </HierarchicalDataTemplate>

            <HierarchicalDataTemplate DataType="{x:Type Implementations:PumpViewModel}" ItemsSource="{Binding Children}">
                <StackPanel Orientation="Horizontal">
                    <Image Width="16" Height="16" Margin="3,0" Source="Images\State.png" />
                    <TextBlock Text="{Binding Name}" />
                </StackPanel>
            </HierarchicalDataTemplate>

            <DataTemplate DataType="{x:Type Implementations:PumpDesignViewModel}">
                <StackPanel Orientation="Horizontal">
                    <Image Width="16" Height="16" Margin="3,0" Source="Images\City.png" />
                    <TextBlock Text="{Binding Name}" />
                </StackPanel>
            </DataTemplate>
        </TreeView.Resources>
    </TreeView>

Ответы [ 2 ]

2 голосов
/ 20 декабря 2010

к названию вопроса: да.Виртуальная машина главного представления должна отображать AboutBox.

Но тело сообщения кажется другим, может быть, вы можете немного расширить его?

0 голосов
/ 08 февраля 2011

Предпочтительный способ сделать это - использовать шаблон команды, как вы уже упоминали. То есть привязать к реализации ICommand через свойство зависимости.

Свойства зависимостей фактически реализуются статическим вспомогательным свойством, которое реализует компоненты зависимости, используемые платформой.

К сожалению, способ, которым MS решила реализовать свойство поддержки, - ну, по меньшей мере, не оптимален.

Он подключается к общедоступному нестатическому свойству, с которым вы связываете в xaml, с помощью жестко закодированной строки ...

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

Если вам все еще это нужно, я могу отправить вам дополнительную информацию по этому вопросу. Вы знаете, где меня найти: -)

Еще одна проблема, на которую вам нужно обратить внимание, - абстрагироваться от реализации представления для поддержания тестируемости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...