У меня есть собственное приложение WPF MVVM (Prism), которое я разрабатываю, и у меня возникли проблемы с привязками ComboBox
в пределах DataGrid
. Я видел других с похожими проблемами, но ничего совершенно одинакового, и я не могу получить ответы на 100% для моей ситуации.Проблемы с привязкой DataGridComboBoxColumn в приложении WPF MVVM
Для этого конкретного представления я представляю отношения родитель-потомок. При отображении формы я показываю родительскую информацию сверху в базовом Grid
, и эти привязки работают нормально. Ниже находится DataGrid
с 1: многими элементами, относящимися к этой родительской записи. Это довольно просто - всего лишь TextBox
, представляющий заказ на дисплей, а затем ComboBox
, содержащий значение типа статистики. ComboBox
привязан к ObservableCollection
, и я могу получить его для правильного отображения этих значений; однако я не могу заставить его выбрать правильное значение для данной записи. Я могу отобразить правильное значение в TextBox
, поэтому я знаю, что значения верны, я просто не могу получить правильные привязки на ComboBox
.
Вот уместна код:
Вид:
<DataGrid AutoGenerateColumns="false" Name="DataGridStatistics" Width="900"
ItemsSource="{Binding Path=DspTemplateStats, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
>
<DataGrid.Columns>
<DataGridTextColumn Header="Display Order" Width="100"
Binding="{Binding Path=DisplayOrder, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
<!-- This is where the issue is. It is displaying the StatisticTypeName properly in the combobox, but it is not connecting the StatisticId
from the DspTemplateStats collection to the StatisticTypes collection -->
<DataGridComboBoxColumn Header="Statistic Type 2"
SelectedValueBinding="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.StatisticId}"
SelectedValuePath="StatisticId"
DisplayMemberPath="StatisticTypeName"
>
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.StatisticTypes}"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.StatisticTypes}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
<!-- This is temporary to test the binding. It displays the correct value -->
<DataGridTextColumn Header="Statistic" Width="*" Binding="{Binding Path=StatisticTypeName, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
</DataGrid.Columns>
</DataGrid>
ViewModel
// This is how DspTemplateStats is defined, populated from Stored Procedure
// I pass it the ProejctTemplateId and it retrieves all the Statistics associated with it
private ObservableCollection<ProjectTemplateStat> dspTemplateStats;
public ObservableCollection<ProjectTemplateStat> DspTemplateStats
{
get { return dspTemplateStats; }
set
{
dspTemplateStats = value;
OnPropertyChanged("DspTemplateStats");
}
}
// This is how StatisticTypes is defined, populated from Stored Procedure
// It pulls back all StatisticTypes defined in the database
private ObservableCollection<StatisticType> statisticTypes;
public ObservableCollection<StatisticType> StatisticTypes
{
get { return statisticTypes; }
set
{
statisticTypes = value;
OnPropertyChanged("StatisticTypes");
}
}
И ключевые Модели
public class ProjectTemplateStat
{
public int ProjectTemplateId { get; set; }
public int TemplateStatId { get; set; }
public int StatisticId { get; set; }
public string TemplateName { get; set; }
public string StatisticTypeName { get; set; }
public int DisplayOrder { get; set; }
}
// The match should between StatisticType.StatisticTypeId and ProjectTemplateStat.StatisticId
public class StatisticType
{
public int StatisticTypeId { get; set; }
public int UOMId { get; set; }
public string UOMValue { get; set; }
public int DatatypeId { get; set; }
...
}
Я чувствую, что проблема связана с привязками DataGridComboBoxColumn
, но, похоже, не может понять, что мне не хватает. Спасибо за понимание.
Я был слеп к тому факту, что я использовал ту же собственность, которую, как мне кажется, так долго смотрел на нее. Уже было готово готовое изделие, но он не видел его. Спасибо, что позволили мне это увидеть. – bassrek