C# 绑定到包含ComboBox的DataGridTemplateColumn
我需要将一个DataColumn绑定到表示DataGridTemplateColumn内ComboBox的SeleteTEdItem的对象。我尝试了几乎所有的方法,但我只能绑定到antother列的标题 XAML如下所示:C# 绑定到包含ComboBox的DataGridTemplateColumn,c#,wpf,combobox,C#,Wpf,Combobox,我需要将一个DataColumn绑定到表示DataGridTemplateColumn内ComboBox的SeleteTEdItem的对象。我尝试了几乎所有的方法,但我只能绑定到antother列的标题 XAML如下所示: <DataGrid.Columns> <DataGridTemplateColumn x:Name="MealPartsColumn" Header="Składniki"> <DataGridTemplateColum
<DataGrid.Columns>
<DataGridTemplateColumn x:Name="MealPartsColumn" Header="Składniki">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox x:Name="MealPartsComboBox" ItemsSource="{Binding MealParts}" SelectedIndex="0" SelectedValuePath="{Binding FoodQuantity}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=FoodProduct.ProductName}" Width="100"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Binding="{Binding ElementName=MealPartsComboBox, Path=SeletectedItem.FoodQuantity}" ClipboardContentBinding="{x:Null}" Header="Ilość w gramach" Width="100"/>
</DataGrid.Columns>
我的模型描述了这一点:
public class Meal
{
public List<MealPart> MealParts { get;set; }
}
public class MealParts
{
public float FoodQuantity {get;set;}
public FoodProduct FoodProduct {get;set;}
}
public class FoodProduct
{
public string ProductName {get;set;}
}
公共课餐
{
公共列表MealParts{get;set;}
}
公共类MealParts
{
公共浮点FoodQuantity{get;set;}
公共FoodProduct FoodProduct{get;set;}
}
公共类食品产品
{
公共字符串ProductName{get;set;}
}
相关后端代码:
Meals = new ObservableCollection<Meal>(mealsForDay);
HistoryDataGrid.ItemsSource = Meals;
膳食=新的可观察到的采集(mealsForDay);
HistoryDataGrid.ItemsSource=膳食;
ComboBox中的ProductName正在正确填充,但是,我无法将其绑定到TextColumn。
<DataGridTemplateColumn x:Name="MealPartsColumn" Header="Składniki">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox x:Name="MealPartsComboBox" DisplayMemberPath="FoodProduct.ProductName" ItemsSource="{Binding MealParts}" SelectedItem="{Binding SelectedMealPart, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Ilość w gramach" Binding="{Binding SelectedMealPart.FoodQuantity, UpdateSourceTrigger=PropertyChanged}" />
这是我编写的代码,它终于可以工作了。我需要显式地设置UpdateSourceRigger以使该解决方案正常工作。
<DataGridTemplateColumn x:Name="MealPartsColumn" Header="Składniki">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox x:Name="MealPartsComboBox" DisplayMemberPath="FoodProduct.ProductName" ItemsSource="{Binding MealParts}" SelectedItem="{Binding SelectedMealPart, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Ilość w gramach" Binding="{Binding SelectedMealPart.FoodQuantity, UpdateSourceTrigger=PropertyChanged}" />
我认为你应该通过在你的
餐点上绑定一个属性来做到这一点
:
public class Meal : INotifyPropertyChanged
{
public List<MealPart> MealParts { get;set; }
public MealPart SelectedMealPart {
get { return _selected; }
set { _selected = value;
// Implement INotifyPropertyChanged and fire the event here
}
}
}
以及:
我认为您的一些问题可能来自这样一个事实:当网格中的每一行都存在元素时,您是按元素名称绑定的。如果到那时你还没有答案,我明天早上会有时间进一步挖掘。
<DataGridTextColumn Binding="{Binding SelectedMealPart.FoodQuantity}" ...>