2016-04-27 6 views
1

zu aktualisieren Ich habe ein DevExpress GridControl in WPF mit einem gebundenen ItemsSource und Felder in den Spalten. Wenn ich die Werte in der Datenquelle initialisiere, funktioniert alles gut, aber wenn die Daten aktualisiert werden sollen, tut es das nicht.Ich versuche, gebundene Werte auf DevExpress GridControl ItemsSource

Ich habe auch eine Bezeichnung in der Benutzersteuerung, die das GridControl enthält und das gut aktualisiert.

Also meine XAML ist:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="250" /> 
     <RowDefinition Height="3*" /> 
    </Grid.RowDefinitions> 

    <dxg:GridControl Grid.Row="0" x:Name="grid" DataContext="{StaticResource ParamDataSource}" ItemsSource="{Binding Path=ObservableParams}"> 
     <dxg:GridControl.Columns> 
      <dxg:GridColumn x:Name="ParamName" FieldName="ParamName" MinWidth="80" Width="80" AllowResizing="False" FixedWidth="True" Header="Parameter" /> 
      <dxg:GridColumn x:Name="ParamValue" Binding="{Binding ParamValue}" MinWidth="50" Width="50" SortIndex="0" Header="Best Value" /> 
     </dxg:GridControl.Columns> 

     <dxg:GridControl.View> 
      <dxg:TableView VerticalScrollbarVisibility="Hidden" x:Name="view" ShowGroupPanel="False" AllowFixedGroups="True" ShowGroupedColumns="False" AllowCascadeUpdate="False" AllowScrollAnimation="False" NavigationStyle="Row" AutoWidth="True" ShowFixedTotalSummary="False" /> 
     </dxg:GridControl.View> 
    </dxg:GridControl> 

    <Label DataContext="{StaticResource ParamDataSource}" Content="{Binding LabelText}" Margin="10, 10, 10, 10" Grid.Row="1"/> 
</Grid> 

Und dann die C# -Code für die Datenquelle ...

class ParamDataSource : ViewModelBase // using DevExpress.Mvvm above 
{ 

    public ParamDataSource() 
    { 

// This stuff is put on the grid no problem. 

     ObservableParams = new System.Collections.ObjectModel.ObservableCollection<ParamTableRow> 
      { 
       new ParamTableRow 
       { 
        ParamName = "Param1", 
        ParamValue = 0 
       }, 

       new ParamTableRow 
       { 
        ParamName = "Param2", 
        ParamValue = 0 
       }, 

       new ParamTableRow 
       { 
        ParamName = "Param3", 
        BestValue = 0 
       } 
      }; 

     LabelText = "Starting Now"; 
    } 

    public ObservableCollection<ParamTableRow> ObservableParams { get; set; } 

    public string LabelText { get; set; } 

    public void UpdateParam(int paramIndex, decimal? paramValue) 
    { 
     ObservableParams[paramIndex].ParamValue = paramValue; 
     RaisePropertyChanged("ObservableParams"); 

// This label updates on the view just fine, but not the parameter values... 

     LabelText = string.Format("Done Param {0}", paramIndex); 
     RaisePropertyChanged("LabelText"); 
    } 
} 

public class ParamTableRow 
{ 
    public string ParamName { get; set; } 
    public decimal? ParamValue { get; set; } 
} 

Antwort

1

Gerade INotifyPropertyChanged auf Ihrer Modellklasse implementieren:

public class ParamTableRow:INotifyPropertyChanged 
{ 
    private string paramName; 

    public string ParamName 
    { 
     get { return paramName; } 
     set { 
      paramName = value; 
      OnPropertyChanged("ParamName"); 
     } 
    } 

    private decimal? paramValue; 
    public decimal? ParamValue 
    { 
     get { return paramValue; } 
     set 
     { 
      paramValue = value; 
      OnPropertyChanged("ParamValue"); 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
    public void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    }   
} 

Ursache ObservableCollection implementiert INotifyCollectionChanged, nicht INotifyPropertyChanged.

INotifyCollectionChanged wird verwendet, um die Benutzeroberfläche zu benachrichtigen, wenn Elemente hinzugefügt oder aus der Sammlung entfernt werden.

INotifyPropertyChanged wird verwendet, um die Benutzeroberfläche zu benachrichtigen, wenn für Ihre Eigenschaft ein neuer Wert festgelegt wurde.

+0

Großartig, dass es aussieht, aus irgendeinem Grund dachte ich, dass es 'ParamDataSource' war, die' INotifyPropertyChanged' implementieren musste und dass das von 'ViewModelBase' erledigt wurde ... – colmde

+0

@colmde' ViewModelBase' ist ererbte Klasse und gibt Ihnen die Möglichkeit, 'RaisePropertyChanged (string propertyName)' zu verwenden. Sie verwenden die Methode jedoch nicht, sodass nichts passiert. Schreiben Sie einfach "RaisePropertyChanged (string propertyName)" in Ihre Eigenschaften-Settings und alle Daten aus Ihrem Modell werden aktualisiert. – StepUp