2016-04-01 6 views
0

У меня есть собственное приложение 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, но, похоже, не может понять, что мне не хватает. Спасибо за понимание.

ответ

0

Недвижимость, используемая для SelectedValueBinding, будет нестандартной собственностью (держателем), чтобы получить выбранное пользователем значение. Вы используете одно и то же свойство для SelectedValuePath и SelectedValueBinding, что не имеет смысла.

+0

Я был слеп к тому факту, что я использовал ту же собственность, которую, как мне кажется, так долго смотрел на нее. Уже было готово готовое изделие, но он не видел его. Спасибо, что позволили мне это увидеть. – bassrek

Смежные вопросы