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