2017-01-25 4 views
0

Ich arbeite an einer WPF-Anwendung mit einem DataGrid, das Spalten manuell definiert hat. In diesem DataGrid soll der Benutzer Daten einschließlich einer unteren Grenze (ein Dezimalwert) und eines Vergleichszeichens ("<" oder "< =") eingeben können.Bestehende Daten in WPF nicht sichtbar DataGridComboBoxColumn an ​​ObservableCollection gebunden

Das Datagrid selbst an einem ObservableCollection namens StepDataSource gebunden ist, - die nicht Teil des Viewmodels ist -

/// <summary> 
    /// Gets or sets the data of the stepfunction. 
    /// </summary> 
    public ObservableCollection<StepData> StepDataSource 
    { 
     get { return stepdataSource; } 
     set 
     { 
      stepdataSource = value; 
      RaisePropertyChanged("StepDataSource"); 
     } 
    } 

Die Klasse StepData enthält die folgenden Eigenschaften:

/// <summary> 
    /// Gets or sets the lower bound. 
    /// </summary> 
    public double LowerBound { get; set; } 

    /// <summary> 
    /// Gets or sets the assigned value. 
    /// </summary> 
    public double StepValue { get; set; } 

    /// <summary> 
    /// Gets or sets the lower comparer. 
    /// </summary> 
    public ArithmeticSignData LowerComparer2 { get; set; } 

Die letzte Eigenschaft LowerComparer2 wird für den Artikel benötigt, der in der ComboBox ausgewählt wurde.

Einer meiner Spalten im Datagrid ist ein DataGridComboBoxColumn, die auf eine andere ObservableCollection in meinem Viewmodel gebunden ist:

public ObservableCollection<ArithmeticSignData> LowerComparers2 { get; set; } 

Die Klasse ArithmeticSignData enthält Eigenschaften für den Schlüssel und Wert, der durch die ComboBox verwendet werden soll.

public class ArithmeticSignData 
{ 
    /// <summary> 
    /// The constructor. 
    /// </summary> 
    /// <param name="key">The key.</param> 
    /// <param name="value">The value.</param> 
    public ArithmeticSignData(string key, string value) 
    { 
     ArithmeticSignKey = key; 
     ArithmeticSignValue = value; 
    } 

    public string ArithmeticSignKey { get; set; } 

    public string ArithmeticSignValue { get; set; } 

} 

Im Viewmodel Ich bin dieser Sammlung Füllung:

 LowerComparers2 = new ObservableCollection<ArithmeticSignData>(); 
     LowerComparers2.Add(new ArithmeticSignData("1", "<")); 
     LowerComparers2.Add(new ArithmeticSignData("2", "<=")); 

Dann definiert i die Spalte im Datagrid wie folgt aus:

<DataGrid x:Name="grd_stepdata" 
       Grid.Row="0" 
       Grid.Column="0" 
       Margin="5" 
       AutoGenerateColumns="False" 
       CanUserAddRows="True" 
       CanUserDeleteRows="True" 
       SelectionUnit="FullRow" 
       ItemsSource="{Binding StepDataSource, NotifyOnSourceUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 
     <DataGrid.Columns> 
      <DataGridComboBoxColumn x:Name="col_LowerComparer2" 
            SelectedItemBinding="{Binding LowerComparer2, NotifyOnSourceUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
            DisplayMemberPath="ArithmeticSignValue" 
            Header="LowComp"/> 
     </DataGrid.Columns> 
    </DataGrid> 

von einigen Artikeln in diesem Forum habe ich gelernt, dass die ItemsSource in Code-Behind eingestellt werden muss:

col_LowerComparer2.ItemsSource = vm.LowerComparers2; 

Wenn ich die App starte und ein Element auswähle, kann ich in meiner viewmodel-Eigenschaft LowerComparer2 das ausgewählte Element mit dem richtigen Schlüssel und Wert sehen. Leider kann ich die Daten aus dem Viewmodel in der Spalte nicht sehen, nachdem ich die App gestartet habe.

Habe ich ein oder mehrere Attribute vergessen?

+0

Ist die StepDataSource Sammlung Ansicht Modellobjekte enthalten, dh Objekte des Typs, in dem die LowerComparer2 und die LowerComparers2 Eigenschaften definiert sind, ? Oder was ist StepDataSource und wo ist es definiert? – mm8

Antwort

2

Try this:

<DataGridComboBoxColumn x:Name="col_LowerComparer2" 
            SelectedItemBinding="{Binding LowerComparer2, NotifyOnSourceUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
            DisplayMemberPath="ArithmeticSignValue" 
            Header="LowComp"> 
    <DataGridComboBoxColumn.ElementStyle> 
     <Style TargetType="ComboBox"> 
      <Setter Property="ItemsSource" Value="{Binding Path=DataContext.LowerComparers2, RelativeSource={RelativeSource AncestorType=DataGrid}}" /> 
     </Style> 
    </DataGridComboBoxColumn.ElementStyle> 
    <DataGridComboBoxColumn.EditingElementStyle> 
     <Style TargetType="ComboBox"> 
      <Setter Property="ItemsSource" Value="{Binding Path=DataContext.LowerComparers2, RelativeSource={RelativeSource AncestorType=DataGrid}}" /> 
     </Style> 
    </DataGridComboBoxColumn.EditingElementStyle> 
</DataGridComboBoxColumn> 

Beachten Sie auch, dass das Objekt von der LowerComparer2 Eigenschaft des StepData Objekt zurückgegeben werden, müssen in der LowerComparers2 Sammlung des MainViewModelClass für ein Element vorhanden sein, ausgewählt werden. Dies bedeutet, dass Sie diese Eigenschaft nicht auf ein neuesArithmeticSignData Objekt festlegen können. Sie sollten es zu einem der ArithmeticSignData Objekte gesetzt, die bereits an der LowerComparers2 Sammlung hinzugefügt wurden:

using System.Linq; 
... 

public MainWindow() 
{ 
    // The window components are initialized. 
    InitializeComponent(); 

    // DataContext gets the viewmodel. 
    DataContext = vm; 

    vm.StepDataSource.Add(new StepData("<", 0, 0, vm.LowerComparers2.FirstOrDefault(x => x.ArithmeticSignKey == "1"))); 
    vm.StepDataSource.Add(new StepData("<=", 0.1, 0.8, vm.LowerComparers2.FirstOrDefault(x => x.ArithmeticSignKey == "2"))); 
    vm.StepDataSource.Add(new StepData("<", 0.2, 1.2, vm.LowerComparers2.FirstOrDefault(x => x.ArithmeticSignKey == "1"))); 
    vm.StepDataSource.Add(new StepData("<=", 0.3, 1.4, vm.LowerComparers2.FirstOrDefault(x => x.ArithmeticSignKey == "2"))); 
    ChartDataRefresh(); 

    ... 
} 
+0

Danke mm8. Mit dem ersten Beispiel funktioniert die ItemsSource-Bindung jetzt auch in XAML. Aber ich kann die vorhandenen Daten in der Spalte col_LowerComparer2 nicht sehen. Inzwischen habe ich die Dateien meiner Lösung in ein GitHub-Repository hochgeladen: https://github.com/patrickpirzer/StepFunctions –

+0

Hallo mm8.Das ItemsSource-Binding funktioniert jetzt auch in XAML, aber ich kann immer noch nicht die vorhandenen Daten in der Spalte "col_LowerComparer2" nachdem ich die App gestartet habe. Inzwischen habe ich die Dateien meiner App in ein GitHub-Repository importiert: https://github.com/patrickpirzer/StepFunctions –

+0

Die Bindung funktioniert, aber Sie können die Daten immer noch nicht sehen? Was bedeutet das? – mm8

Verwandte Themen