2016-04-27 30 views
1

私はDevExpress GridControlをWPFでバインドされたItemsSourceとカラムのフィールドに持っています。データソース内の値を初期化すると、すべて正常に動作しますが、データが更新される予定のときは正常に動作しません。DevExpress GridControl ItemsSourceでバウンド値を更新しようとしています

また、GridControlを含むユーザーコントロール内にラベルがあり、それは正常に更新されます。

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

し、データソースのためのC#コード...

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

答えて

1

はちょうどあなたのモデルクラスにINotifyPropertyChangedを実装:

は、だから私のXAMLはある

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

原因ObservableCollectionは、ではなく、INotifyCollectionChangedを実装しています。

INotifyCollectionChangedは、アイテムがコレクションに追加または削除されたときにUIに通知するために使用されます。

INotifyPropertyChangedは、プロパティに新しい値が設定されたときにUIに通知するために使用されます。

+0

何らかの理由で私はそれが 'INotifyPropertyChanged'を実装しなければならない' ParamDataSource'であり、 'ViewModelBase'が世話をしていたと思っていました... – colmde

+0

@colmde' ViewModelBase'はクラスを継承し、 'RaisePropertyChanged(string propertyName)'を利用する機会を与えます。しかし、あなたはこのメソッドを利用していないので、何も起こりません。プロパティのセッターに 'RaisePropertyChanged(string propertyName)'と書くだけで、モデルのすべてのデータが更新されます。 – StepUp

関連する問題