最好先向我展示我的代码,然后提出问题:
<Window DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
<DataGrid ItemsSource="{Binding Printers}" >
<DataGrid.Columns>
<DataGridComboBoxColumn Header="Drucker Typ" ItemsSource="{Binding Relative" SelectedItemBinding="{Binding PrinterType, Mode=TwoWay}" Width="Auto" ItemsSource="{Binding}" />
</DataGrid.Columns>
</DataGrid>
</Window>
我有DataGridComboBoxColumn
并希望将ItemsSource
绑定到窗口的DataContext
,将SelectedItem
绑定到DataGrid的当前ItemsSource
对象
如何做到这一点?
谢谢!
答案 0 :(得分:4)
要避免使用您必须熟悉NameScope的ElementName,您还可以使用FindAncestor。在这里,您可以定义要绑定到的父对象的类型。
示例:
<TextBlock Text=”{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=Text}” />
答案 1 :(得分:2)
使用ElementName绑定表达式。这将允许您从绑定表达式中按名称引用窗口。
http://msdn.microsoft.com/en-us/library/system.windows.data.binding.elementname.aspx
这里解释了用法。
答案 2 :(得分:0)
<local:DataBaseSettings>
<Grid>
<DataGrid ItemsSource="{Binding Printers}">
<DataGrid.Columns>
<DataGridComboBoxColumn Header="Drucker Typ"
ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:DataBaseSettings}}, Path=PrinterTypes}"
SelectedItem="{Binding PrinterType, Mode=TwoWay}" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</local:DataBaseSettings>
请注意,如果每个Printer.PrinterType
没有直接引用Window的DataContext中存在的项,则需要覆盖.Equals()
类的PrinterType
方法以使这两个项目相等
像
这样的东西public override bool Equals(object obj)
{
if (obj == null) return false;
if (this.GetType() != obj.GetType()) return false;
PrinterType printerType= (PrinterType)obj;
return (this.Id == printerType.Id);
}
答案 3 :(得分:0)
现在我发现除了在运行时设置itemssource之外没有其他方法可以做到这一点:
private void SetComboBoxItemssource()
{
PrinterTypes = database.GetPrinterTypes();
DataGridComboBoxColumn cmbColumn = null;
foreach (DataGridColumn column in dtaPrinters.Columns)
{
if ((cmbColumn = column as DataGridComboBoxColumn) != null)
break;
}
if (cmbColumn == null)
return;
cmbColumn.ItemsSource = PrinterTypes;
}
虽然有效..
答案 4 :(得分:0)
我只能将此工作绑定到窗口的资源:
<DataGridComboboxColumn ItemsSource="{Binding Path=PrinterTypes, Source={StaticResource MyDataContext}}" ... />
我无法使用RelativeSources,FindAncestors等。
答案 5 :(得分:0)
以下对我有用。只是想发布它,因为我使用的答案被纳入了fix_likes_codes的答案的评论中。关键是在路径中的属性名称前面添加DataContext前缀。
<Button Command="{Binding Path=DataContext.SaveCommand, RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}}"
CommandParameter="{Binding}">