Joh*_*aft 2 c# data-binding wpf xaml datagrid
我正在开发我的第一个'生产'WPF应用程序,我遇到了一个问题.
我有一些类似于下面的例子的代码.我遇到的问题是我无法ComboBox填充.我猜想这是因为Grid的ItemsSource是'堵’ ComboBox,从能够看到的视图模型的任务集合,但我只是猜测.其他一切都是正确的数据绑定.
我搜索了SO并找到了这个问题; 这听起来和我想做的完全一样,但它对我不起作用.
知道为什么我不能进入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; }
}
Run Code Online (Sandbox Code Playgroud)
视图模型:
public ApprovalViewModel{
public ObservableCollection<Activity> Activities { /* ... property logic */ }
public ObservableCollection<Task> Tasks { /* ... property logic */ }
}
Run Code Online (Sandbox Code Playgroud)
视图:
<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>
Run Code Online (Sandbox Code Playgroud)
编辑:正确的ComboBox代码在这里:
<ComboBox
ItemsSource="{Binding Path=DataContext.Tasks,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type UserControl}}}"
SelectedValue="{Binding Task.Title}"
SelectedValuePath="Title"
DisplayMemberPath="Title"/>
Run Code Online (Sandbox Code Playgroud)
你在问题出在哪里是正确的,绑定是相对的Activity.所以它正在寻找Activity.Tasks.
您链接的帖子有正确的方法,您只需根据您的情况调整它.
ItemsSource="{Binding Path=DataContext.Tasks, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
Run Code Online (Sandbox Code Playgroud)
这将返回Visual树,查找具有DataContext.Tasks属性的Window .
你的代码示例是在窗口内吗?如果不是,您将需要更改{x:Type},其次是DataContext此对象上的设置?如果不是,则需要将其设置为ViewModel.