我正在尝试将ItemsSource
绑定到ComboBox
中的RowDetailsTemplate
。如果我将一个ComboBox放在网格外面,它可以正常工作。我认为这是因为网格上的ItemsSource属性可能会抛弃RowDetailsTemplate中的ComboBox。 XAML低于任何想法?
类别和CatTypes是两个不同的ObservableCollection
s。
没有发生错误; ComboBox只显示为空。
<ComboBox ItemsSource="{Binding CatTypes}"></ComboBox>
<my:DataGrid Name="gridProds" AutoGenerateColumns="False"
AlternatingRowBackground="Gainsboro" ItemsSource="{Binding Categories}">
<my:DataGrid.Columns>
<my:DataGridTextColumn x:Name="CatId" Header="CatID" Width="Auto" Binding="{Binding CategoryID}" />
<my:DataGridTextColumn Header="CatName" Width="Auto" Binding="{Binding CategoryName}" />
</my:DataGrid.Columns>
<my:DataGrid.RowDetailsTemplate>
<DataTemplate>
<Border>
<StackPanel>
<StackPanel Orientation="Horizontal">
<Label>ID:</Label>
<TextBox Name="txtGridCatId" Text="{Binding CategoryID}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Label>Category Type:</Label>
<ComboBox ItemsSource="{Binding CatTypes}"></ComboBox>
</StackPanel>
</StackPanel>
</Border>
</DataTemplate>
</my:DataGrid.RowDetailsTemplate>
</my:DataGrid>
在被调用的DataSource中有一个类,其中包含以下内容:
private ObservableCollection<string> _cattypes = new ObservableCollection<string> { };
public ObservableCollection<string> CatTypes
{
get
{
_cattypes = new ObservableCollection<string> { };
SqlConnection con = new SqlConnection("MyConnStringHere;");
SqlCommand cmd = new SqlCommand("Select ID, CatType from PfCategoryType ORDER BY CatType", con);
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
string CatType = (string)rdr["CatType"];
_cattypes.Add(CatType);
}
con.Close();
return _cattypes;
}
}
在MainWindow.xaml.cs中我有:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataSource dataSource = new DataSource();
this.DataContext = dataSource;
}
}
答案 0 :(得分:0)
如果在VS中检查了调试输出,则会看到实际的绑定错误。最有可能在代码之下将为您修复它。
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=CatTypes}" />
如果你无法让RelativeSource工作,那就使用名字。 CatTypes属性是某个类的属性,您为某个控件创建了一个对象并将其设置为datacontext。只需给该控件命名(例如myControl)并像这样绑定:
<ComboBox ItemsSource="{Binding ElementName=myControl, Path=CatTypes}" />
如果这不起作用,您需要发布更多代码来弄清楚你做错了什么。
答案 1 :(得分:0)
如果你试试这会怎么样?
<ComboBox DataContext="{Binding DataContext, ElementName=myControl}" ItemsSource="{Binding CatTypes}" />
(当然你要重命名“myControl”以匹配你的窗口名称。)
这里,我们将组合框的数据上下文设置为与窗口的数据上下文相同。由于这也是XAML中第一个组合框的相同数据上下文,我想第二个组合框的行为与第一个相似。 (虽然我担心这会导致一些不必要的数据库连接,每个网格行一个。)
第二个想法,如果你需要在行的上下文中设置其他属性,你不会想要设置整个ComboBox的数据上下文。在那种情况下,我会尝试这样的事情。
<ComboBox ItemsSource="{Binding ElementName=myControl, Path=DataContext.CatTypes}" SelectedItem="{Binding CategoryType}" />