2016-04-01 11 views
0

Ich habe eine benutzerdefinierte WPF MVVM (Prism) -Anwendung, die ich entwickle und habe Probleme mit ComboBox Bindungen innerhalb einer DataGrid. Ich habe andere mit ähnlichen Problemen gesehen, aber nichts ist gleich und ich kann keine der Antworten erhalten, um 100% für meine Situation zu arbeiten.DataGridComboBoxColumn Bindungsprobleme in WPF MVVM-Anwendung

Für diese bestimmte Ansicht, repräsentiere ich eine Eltern-Kind-Beziehung. Beim Anzeigen des Formulars zeige ich die Elterninformationen oben in einem grundlegenden Grid an und diese Bindungen funktionieren gut. Darunter ist ein DataGrid mit 1: viele Elemente zu diesem übergeordneten Datensatz. Es ist ziemlich einfach - nur ein TextBox, das Displaydarstellung darstellt, dann ein ComboBox, der einen Wert des Statistiktyps hält. Die ComboBox ist an eine ObservableCollection gebunden und ich kann es bekommen, um diese Werte richtig anzuzeigen; es ist mir jedoch nicht möglich, den korrekten Wert für den angegebenen Datensatz auszuwählen. Ich bin in der Lage, den richtigen Wert in einem TextBox anzuzeigen, damit ich weiß, dass die Werte richtig sind, kann ich nicht die richtigen Bindungen auf dem ComboBox bekommen.

Hier ist der relevante Code:

Ausblick:

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

Ansichtsmodell

// 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"); 
    } 
} 

und der Schlüssel Modelle

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

Ich fühle mich wie das Problem ist auf der DataGridComboBoxColumn Bindungen, aber kann nicht scheinen, herauszufinden, was ich vermisse. Danke für jede Einsicht.

Antwort

0

Die für SelectedValueBinding verwendete Eigenschaft wäre eine benutzerdefinierte Eigenschaft (Platzhalter), um den vom Benutzer ausgewählten Wert zu erhalten. Sie verwenden die gleiche Eigenschaft für SelectedValuePath und SelectedValueBinding, die bedeutungslos ist.

+0

Ich war blind für die Tatsache, dass ich die gleiche Eigenschaft verwendet habe, denke ich, seit es so lange anstarrt. Hatte bereits die benutzerdefinierte Eigenschaft bereit, aber sah es nicht. Danke, dass ich es sehen durfte. – bassrek