2013-12-10 3 views
0

Мне нужно привязать один DataColumn к объекту, представляющему SeletectedItem из ComboBox, который находится внутри DataGridTemplateColumn. Я попробовал почти все, но мне удалось привязать только к колонке с колонтитулом.Привязать к DataGridTemplateColumn, содержащему ComboBox

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;} 
} 

Соответствующий код бэкенд:

Meals = new ObservableCollection<Meal>(mealsForDay); 
HistoryDataGrid.ItemsSource = Meals; 

ProductName в ComboBox заполняемых правильно, однако , Я не могу привязать его к TextColumn.

Это код, который я сделал, который, наконец, работает. Мне нужно было установить явно UpdateSourceTrigger, чтобы это решение работало.

<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}" /> 
+0

Я думаю, что некоторые из ваших проблем может исходить из того, что вы связываете по имени элемента, когда этот элемент существует в каждой строке в сетка. У меня будет время утром, чтобы копать дальше, если у вас нет ответа к тому времени. – Mike

ответ

0

Я думаю, что вы должны сделать это за счет связывания через свойство на вашем Meal:

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

Вам нужно будет реализовать INotifyPropertyChanged, чтобы получить привязок правильно обновить.

Тогда:

<ComboBox ... SelectedItem={Binding SelectedMealPart}" ...> 

И:

<DataGridTextColumn Binding="{Binding SelectedMealPart.FoodQuantity}" ...> 
Смежные вопросы