2010-12-27 15 views
0

質問に非常に似ていますかと私の質問は、このフォーラムのここにあるWPFの親UserControlでDataGrid SelectedItemを公開します。 2つのUserControlがマスターディテールウィンドウで使用されているXAMLファイルがあります。最初のUserControlは、いくつかのウィジェットを保持するDataGridであり、2番目のUserControlは選択されたウィジェットの詳細情報を保持します。私はMVVMのパターンをユーザーにしようとしているので、DataGridのSelectionChangedイベントを処理するためにRoutedEventHandlerを使わないようにしています。私は、DataGridからselectedItemでDetail-info UserControlが入力されたかどうかをテストするRoutedEventHandlerを作成しました。だから私はそれが働いたことを証明した。ツールキットからSelectedItemを取得する方法MVVMパターンを使用してWPFのUserControlにあるDataGrid

これで、RoutedEventHandlerを削除し、SelectedItem Dependencyプロパティを使用して詳細情報を表示するUserControlに、DataGridの選択が変更されたときに何も表示されなくなりました。私のビューは変更を認識する必要があります。 Josh Smithの記事で、リストビューを使った例を紹介しています。 私はいくつかの投稿/ブログを読んだことがありますが、そのほとんどは答えを提供していないか、UserControlでDataGridを使用していません。

私のビューでは、私のウィンドウのDataContextをwidgetViewModelのCollectionを返すwindowViewModelに設定し、Detailウィジェット情報をwindowViewModel.SelectedItem依存プロパティに保持する同じウィンドウにGroupboxのDataConextを設定します。 //この変数が保持している

のvarのViewModel:私は2つのUserControlを含むウィンドウで、ここで

が....メインのコード

<UserControl.Resources> 

    <Style x:Key="WidgetItemStyle" TargetType="{x:Type toolkit:DataGridRow}"> 
     <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}"/> 
    </Style> 

</UserControl.Resources> 
<Grid> 
    <toolkit:DataGrid 
     x:Name="dgWidgets" 
     DataContext="{StaticResource WidgetsList}" 
     ItemsSource="{Binding}" 
     SelectedItem="{Binding ElementName=WidgetsUserControl, Path=SelectedItem, Mode=TwoWay}" 
     SelectionUnit="FullRow" 
     SelectionChanged="dgWidgets_SelectionChanged" 
     IsSynchronizedWithCurrentItem="true" 
     ItemContainerStyle="{StaticResource WidgetItemStyle}" 
     > 
     <toolkit:DataGrid.Columns> 

ある列DEFS

the windowViewModel

this.DataContext = viewModel; 
this.gBox.DataContext = viewModel.SelectedItem; 

私はかなり長い間このことに苦労していますが、問題はまだ分かりません。

答えて

2

あなたはそこにあります。これは、私のVM上でSelectedItemをプロパティ "currentWidget"にバインドするだけで簡単に動作します。値が変更されると、ユーザーがマスターグリッド内の新しいレコードを選択したことがわかります。詳細コントロールを同じプロパティにバインドします(必要な詳細がすべて含まれている場合)。

XAML

SelectedItem="{Binding currentWidget, Mode=TwoWay}"... 

VMコード

private Widget _currentWidget; 
public Widget currentWidget 
{ 
     get { return _currentWidget; } 
     set 
     { 
      _currentWidget = value; 
      NotifyPropertyChanged("currentWidget"); 
     } 
} 
関連する問題