2011-02-23 18 views
2

私は初めての「プロダクション」WPFアプリケーションで作業していますが、問題が発生しています。
私は以下の例に似たいくつかのコードを持っています。私が抱えている問題は、ComboBoxを入力できないということです。私は、GridItemsSourceは、ComboBoxがViewModel上のTasksコレクションを見ることを「ブロック」していると仮定していますが、私は推測しています。他のすべてが正しくデータバインドされています。ItemSourceの外部でDataGridComboBoxColumnをバインドする方法

私はSOを精査して、this質問を見つけました。それは私がやろうとしているのとまったく同じように聞こえるが、それは私にとってはうまくいかなかった。

なぜ私はComboBoxに値を設定できないのでしょうか?

モデル:

public class Activity{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public Task Task { get; set; } 
} 

public class Task{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
} 

のViewModel:

public ApprovalViewModel{ 
    public ObservableCollection<Activity> Activities { /* ... property logic */ } 
    public ObservableCollection<Task> Tasks { /* ... property logic */ } 
} 

ビュー:

<DataGrid ItemsSource="{Binding Activities}" AutoGenerateColumns="False"> 
    <DataGrid.Resources> 
     <DataTemplate x:Key="displayTemplate"> 
      <TextBlock Text="{Binding Task.Title}"/> 
     </DataTemplate> 
     <DataTemplate x:Key="editTemplate"> 
      <ComboBox ItemsSource="{Binding Tasks}" <!--I think the problem is here--> 
       SelectedValue="{Binding Task}" 
       DisplayMemberPath="Title"/> 
     </DataTemplate> 
    </DataGrid.Resources> 
    <DataGrid.Columns> 
     <DataGridComboBoxColumn DisplayMemberPath="Title"/> 
     <DataGridTextColumn Binding="{Binding User}" Header="User"/> 
     <DataGridTextColumn Binding="{Binding Task.Project.Title}" Header="Project"/> 
     <DataGridTemplateColumn 
      Header="Task" 
      CellTemplate="{StaticResource displayTemplate}" 
      CellEditingTemplate="{StaticResource editTemplate}"/> 
     <DataGridTextColumn Binding="{Binding Description}" Header="Description"/> 
    </DataGrid.Columns> 
</DataGrid> 

編集:正しいComboBoxコードはここにある:

<ComboBox 
    ItemsSource="{Binding Path=DataContext.Tasks, 
         RelativeSource={RelativeSource FindAncestor, 
             AncestorType={x:Type UserControl}}}" 
    SelectedValue="{Binding Task.Title}" 
    SelectedValuePath="Title" 
    DisplayMemberPath="Title"/> 

答えて

5

問題がある場所では、バインディングがActivityに相対的であることが正しいです。だからそれはActivity.Tasksを探しています。

リンク先の投稿には適切なアプローチがあります。状況に応じて調整する必要があります。

ItemsSource="{Binding Path=DataContext.Tasks, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" 

これはDataContext.Tasksプロパティを持つウィンドウを探して戻ってビジュアルツリー上がります。

コード例はウィンドウ内にありますか?そうでない場合は、{x:Type}を変更する必要があります。次に、このオブジェクトにDataContextが設定されていますか?そうでない場合は、ViewModelに設定する必要があります。

+0

ありがとう、完璧に働いた! x:TypeをUserControlに設定する必要がありました。また、FindAncestorがIntellisenseに表示されないので、私は混乱していました(そしてまだです)。しかし、それは動作するようです。 –

関連する問題