В WPF MVVM должен участвовать ViewModel в открытии окна, например. О-окно?

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

Теперь я хочу обработать поведение при двойном щелчке элементов (открытие документов в стиле визуальной студии).

Я могу заставить обработчик событий запускать элемент управления, содержащий древовидную структуру (показан 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>

person Anders Juul    schedule 19.12.2010    source источник


Ответы (2)


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

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

person Henk Holterman    schedule 19.12.2010
comment
Извините, я перепутал два вопроса! - person Anders Juul; 20.12.2010
comment
Что касается вопроса в «теле»: у меня есть объекты viewmodel, обрабатывающие отдельные элементы дерева в отношении отображения, отложенной загрузки и т. д. Однако, когда я хочу «активировать»/дважды щелкнуть элемент в дереве, я бы например, это действие должно обрабатываться теми же объектами модели представления, которые обрабатывают отображение, но как мне это сделать? - person Anders Juul; 20.12.2010
comment
Я отметил это как отвеченный, поскольку был дан ответ на заглавный вопрос. Вопрос «тело» был повторно опубликован здесь. Извините за неудобства (грубое слово ;-)) - person Anders Juul; 21.12.2010
comment
Привет, Андерс, я думаю, это может сбить людей с толку. Почему бы не отредактировать вопрос, чтобы описать исходную проблему - вы же разместили этот вопрос повторно, верно? Ваше здоровье.... - person Sebastian Edelmeier; 01.06.2011

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

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

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

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

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

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

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

person Torben Falck    schedule 08.02.2011
comment
Привет Торбен, спасибо за добавление ваших комментариев! Я думаю, что теперь у меня есть удовлетворительное решение, хотя сопоставление выполняется с помощью строковых литералов в XAML, как вы указываете. Я действительно думаю, что дополнительная сложность от отображения через какое-то причудливое лямбда-выражение того не стоит. Было ли у нас это обсуждение раньше ;-) ? Тем не менее - спасибо, скоро увидимся. - person Anders Juul; 09.02.2011