2011-01-05 52 views
1

DataGridに埋め込まれたComboBoxを持つWPF 4アプリケーションを使用しています。 ComboBoxは、編集モードのときはコンボボックスを表示し、それ以外の場合はTextBlockを表示するテンプレート列にあります。セルを編集してコンボボックスから新しい値を選択すると、セルを離れるときに、ビューモードのTextBlockに新しい値が反映されません。最終的に、新しい値が保存され、ウィンドウがリフレッシュされたときに表示されますが、グリッドで編集中には表示されません。WPF 4 ComboBoxを使用したDatagrid

DBテーブル構造は次のとおりです。Employee(int employeeID、string last、string first、string phone);プロジェクト(int projectID、string projectName); ProjectMember(int projMemID、int projectID、int employeeID、文字列ロール)。 readonlyプロパティFullNameが、first + lastを連結してEmployeeエンティティに追加されました。したがって、TextBlockビューにはProjectMember.Employee.FullNameが表示されます。コンボボックスの項目はEmployee.FullNameから来ます。

これは、これをより複雑にしている部分です。グリッドとコンボボックスは、私のデータベースに結びついているEnityFrameworkから別のItemsSourceにバインドされています。この問題では、グリッドがプロジェクトメンバーを表示しています。コンボボックスからプロジェクトメンバー名を選択すると、すべての社員のリストが表示されます。

DataGridColumnTemplateのビューモードを異なるデータソースを指しているときに編集値に結びつける方法に関するアイデアはありますか?

関連XAML

<Window.Resources> 
    <ObjectDataProvider x:Key="EmployeeODP" /> 
</Window.Resources> 
<StackPanel> 
<DataGrid Name="teamProjectGrid" AutoGenerateColumns="false" ItemsSource="{Binding Path=ProjectMembers}" 
     <DataGrid.Columns> 
      <DataGridTemplateColumn Header="Name" x:Name="colProjectMember"> 
      <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Path=ProjectMemberFullName}" /> 
      </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
      <DataGridTemplateColumn.CellEditingTemplate> 
      <DataTemplate> 
       <ComboBox x:Name="ProjectMemberCombo" IsReadOnly="True" 
        DisplayMemberPath="FullName" 
        SelectedValue="{Binding Path=Employee}" 
        ItemsSource="{Binding Source={StaticResource EmployeeODP}}" 
       /> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellEditingTemplate> 
     </DataGridTemplateColumn> 
     <DataGridTextColumn x:Name="colProjectRole" Binding="{Binding Path=ProjectRole}" Header="Role" /> 
    </DataGrid.Columns> 
</DataGrid> 
</StackPanel> 

​​

答えて

0

背後に関連するコードだけでコンボボックスに置き換えます。また、プロパティを

<ComboBox x:Name="ProjectMemberCombo" IsReadOnly="True" 
       DisplayMemberPath="FullName" SelectedValuePath="FullName" 
       SelectedItem="{Binding Path=Employee}" 
       SelectedValue="{Binding Path=ProjectMemberFullName}" 
       ItemsSource="{Binding Source={StaticResource EmployeeODP}}" 
      /> 

ProjectMemberFullName前夜を上げる必要がありますnt PropertyChanged

あなたは、プロパティのFullNameを取り除くことができます
<TextBlock Text="{Binding Path=Employee.FullName}" /> 

<TextBlock DataContext="{Binding Employee}"> 
    <Run Text="{Binding First}"/> <Run Text="{Binding Last}"/> 
</TextBlock> 

をしかし、実体はINotifyPropertyChangedインターフェイスを実装している場合、私はよく分からない -

別の方法のTextBlockを交換してください。 第2の変形では、従業員が呼び出す必要があるプロパティOnNotifyPropertyChanged("Employee")

+0

迅速な対応をありがとう。私は元の質問を編集してDBテーブルを提供しました。私はまだいくつかのバリエーションを試していますが、どちらのアプローチもうまくいかないようです。 ProjectMemberFullNameは読み取り専用のプロパティであり、双方向バインディングをサポートしていないため、最初は問題がSelectedValueの周りにあります。 2番目の場合、エンティティはINotifyPropertyChangedをサポートしますが、それでも同じ方法で動作します。理由は分かりません。 – Doug

+0

ProjectMemberFullNameはあなたによって書かれたプロパティです。なぜそれを読み書き可能なプロパティに変更できないのですか?また、プロパティの設定者の内部でEmployeeプロパティとpur breakpointをチェックします。 – vorrtex

+0

ProjectMemberFullNameの読み込み/書き込みを行う。設定者は、存在する限り「何もしない」ことさえできます。私は、何が起こっているのかの微妙さとタイミングを理解していますが、それは来るでしょう。エンティティフレームワークを回避しようとすると、時間を節約するよりも時間がかかります。助けてくれてありがとう。 – Doug

関連する問題