我正在尝试在我的DataGrid中设置一个组合框,我不允许设置组合框的ItemSource(在我的.xaml.cs代码中),因为我一直收到这个错误“名字” cboChangeRequestStatus'在当前上下文中不存在。不明白为什么我可以在DataGrid的其他变体中设置它,但在我使用这个集合时却不能
<DataGridTemplateColumn Header="Status">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding StatusCode}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox SelectedValue="{Binding Status, Mode= TwoWay}"
SelectedValuePath="StatusId"
DisplayMemberPath="StatusCode"
Name="cboChangeRequestStatus"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
答案 0 :(得分:1)
你不能轻易做到这一点,你不应该这样做。
直接来自MSDN:
WPF中的样式和模板提供了以直接方式重用和重新应用内容的能力。但是,样式和模板可能还包含在模板级别定义的具有XAML名称的元素。可以在页面中多次使用相同的模板。因此,样式和模板都定义了自己的XAML名称范围,与应用样式或模板的对象树中的任何位置无关。
如果您有类似的类:
public class Test
{
public ObservableCollection<Status> StatusCollection { get; set; }
public Status Status { get; set; }
}
你可以像这样使用它:
ItemsSource="{Binding Path=StatusCollection}"
SelectedItem="{Binding Path=Status, Mode=TwoWay}"
如果集合不是动态的,请考虑为集合创建StaticResource。
答案 1 :(得分:0)
让我们说....你将ViewModel设置为你拥有DataGrid的Window的DataContext ...然后..
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Path=StatusCodes,
RelativeSource={RelativeSource
Mode=FineAncestor
AncetorType={x:type Window}}}"
SelectedValuePath="StatusId"
DisplayMemberPath="StatusCode"
Name="cboChangeRequestStatus"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>