C# 绑定到包含ComboBox的DataGridTemplateColumn

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

我需要将一个DataColumn绑定到表示DataGridTemplateColumn内ComboBox的SeleteTEdItem的对象。我尝试了几乎所有的方法,但我只能绑定到antother列的标题

XAML如下所示:

 <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}" ...>