2010-12-19 1 views
2

표준 WPF 트리 뷰가 있고 모델 클래스를 볼 항목을 바인딩했습니다.WPF에서 MVVM은 ViewModel을 창 열기와 관련시켜야합니다. About-window?

이제는 항목을 두 번 클릭했을 때의 동작 (비주얼 스튜디오 스타일의 문서 열기)을 처리하고자합니다.

TreeView (xaml 표시)가있는 컨트롤에서 이벤트 처리기를 실행할 수 있지만 뷰 모델 클래스의 특정 동작 (예 : ProjectViewModel?

이 다른 곳에서 사용되는 바람직하게는 ..., ICommand의-구현에 의견에 대한

감사합니다, 바인딩

앤더스, 덴마크

제목-질문에
<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

: 예. 기본보기의 VM에 AboutBox가 표시됩니다.

하지만 메시지 본문이 다르게 보일 수도 있습니다. 어쩌면 조금 확장 할 수 있을까요?

+0

죄송합니다 - 두 가지 질문이 섞여 있습니다. –

+0

'body'의 질문에 대해서는 : 표시, 지연로드 등과 관련하여 개별 트리 아이템을 처리하는 viewmodel 객체가 있습니다. 그러나 treeview에서 항목을 '활성화'/ 두 번 클릭하려는 경우, 이 작업을 디스플레이를 처리하는 동일한 viewmodel 객체로 처리하도록하겠습니다.하지만 어떻게해야합니까? –

+0

제목 질문에 답을 얻으면서 답변으로 표시했습니다. '본문'질문은 [여기] (http://stackoverflow.com/questions/4497825/wpf-mvvm-how-to-handle-double-click-on-treeviewitems-in-the-viewmodel)에 다시 게시되었습니다. 죄송합니다 inconveneince (하드 단어 ;-)) –

0

이것을 수행하는 가장 좋은 방법은 이미 언급 한대로 명령 패턴을 사용하는 것입니다. 즉, 의존성 프로퍼티를 통해 ICommand 구현체에 바인딩한다.

종속성 속성은 실제로 프레임 워크에서 사용하는 종속성 항목을 구현하는 정적 백업 속성에 의해 구현됩니다.

MS가 뒷받침 속성을 구현하기로 결정한 방식은 불행히도 - 글쎄, 말하기에 최적이 아닙니다.

는 그것은 대중에게 매여, 비 정적 속성은 XAML에서 바인딩 - 하드 코드 된 문자열에 의해 ...

내가 위치를 기억하지 않습니다하지만 난에 아주 우아한 해결책을 발견 정적/비 정적 관계로 람다 식을 사용하여 매핑을 수행하므로 하드 코딩되고 오류가 발생하기 쉬운 문자열 매핑이 완전히 제거됩니다.

여전히 필요한 경우 이에 대한 정보를 더 보낼 수 있습니다. 나에게 도달 할 수있는 위치를 알고 계신가요? :

주소를 지정해야하는 또 다른 관심사는 테스트 가능성을 유지하기 위해보기의 구현을 추상화하는 것입니다.

+1

안녕하세요 Torben, 의견을 보내 주셔서 감사합니다! 비록 맵핑이 XAML의 문자열 리터럴을 통해 이루어졌지만 지금은 만족스러운 해결책이 있다고 생각합니다. 나는 멋진 람다 표현을 통한 맵핑에서 추가 된 복잡성이 그 가치가 없을 것이라고 생각한다. 전에 우리가이 토론을 가졌습니까 ?-)? 아직도 - 고마워, 곧 보자. –