私は初めての「プロダクション」WPFアプリケーションで作業していますが、問題が発生しています。
私は以下の例に似たいくつかのコードを持っています。私が抱えている問題は、ComboBox
を入力できないということです。私は、Grid
のItemsSource
は、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"/>
ありがとう、完璧に働いた! x:TypeをUserControlに設定する必要がありました。また、FindAncestorがIntellisenseに表示されないので、私は混乱していました(そしてまだです)。しかし、それは動作するようです。 –