2011-11-08 67 views
1

我有一個包含StrategyViewModels列表的ComboBox。 StrategyViewModel在其內部具有StrategyParameterViewModels的ObservableCollection。我有一個名爲SelectedStrategy的StrategyViewModel,它綁定到組合框的SelectedItem屬性。當用戶從組合框中選擇策略時,我想將數據網格的itemsource設置爲該策略中的StrategyParameters。我嘗試過所有不同的方式,但似乎沒有任何工作。如何使用MVVM將Datagrid的ItemSource設置爲對象內的集合

這裏的XAML:

<ComboBox Height="23" Margin="0,12,0,0" Name="cbxStrats" VerticalAlignment="Top" ItemsSource="{Binding Strategies}" DisplayMemberPath="Name" SelectedItem="{Binding Path=SelectedStrategy,Mode=TwoWay}" /> 

<DataGrid AutoGenerateColumns="False" Margin="12,97,14,35" Name="dgSettings" ItemsSource="{Binding SelectedStrategy.Parameters, Mode=TwoWay}"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" IsReadOnly="True"/> 
      <DataGridTextColumn Header="Value" Binding="{Binding Path=Value}" IsReadOnly="False"/> 
     </DataGrid.Columns> 
    </DataGrid> 

這裏是戰略視圖模型:

public class StrategyViewModel : ViewModelBase 
{ 
    public StrategyObject Strategy { get; set; } 

    public int Id 
    { 
     get { return Strategy.Id; } 
     set 
     { 
      if (value == Strategy.Id) 
       return; 
      Strategy.Id = value; 
      OnPropertyChanged("Id"); 
     } 
    } 

    public string Name 
    { 
     get { return Strategy.Name; } 
     set 
     { 
      if (value == Strategy.Name) 
       return; 
      Strategy.Name = value; 
      OnPropertyChanged("Name"); 
     } 
    } 

    public ObservableCollection<StrategyParameterViewModel> Parameters { get { return _parameters; } } 
    public ObservableCollection<StrategyParameterViewModel> _parameters; 

    public StrategyViewModel() 
    { 
     Strategy = new StrategyObject(); 
     _parameters = new ObservableCollection<StrategyParameterViewModel>(); 
    } 

    public StrategyViewModel(StrategyObject o, IEnumerable<StrategyParameterObject> pms) 
    { 
     Strategy = o; 
     _parameters = new ObservableCollection<StrategyParameterViewModel>(); 
     foreach (StrategyParameterObject s in pms) 
     { 
      _parameters.Add(new StrategyParameterViewModel(s)); 
     } 
    } 
} 

這裏是StrategyParameter視圖模型:

public class StrategyParameterViewModel : ViewModelBase 
{ 
    public StrategyParameterObject StrategyParameter { get; set; } 

    public int Id 
    { 
     get { return StrategyParameter.Id; } 
     set 
     { 
      if (value == StrategyParameter.Id) 
       return; 
      StrategyParameter.Id = value; 
      OnPropertyChanged("Id"); 
     } 
    } 

    public int StrategyId 
    { 
     get { return StrategyParameter.StrategyId; } 
     set 
     { 
      if (value == StrategyParameter.StrategyId) 
       return; 
      StrategyParameter.StrategyId = value; 
      OnPropertyChanged("StrategyId"); 
     } 
    } 

    public string Name 
    { 
     get { return StrategyParameter.Name; } 
     set 
     { 
      if (value == StrategyParameter.Name) 
       return; 
      StrategyParameter.Name = value; 
      OnPropertyChanged("Name"); 
     } 
    } 

    public string Value 
    { 
     get { return StrategyParameter.Value; } 
     set 
     { 
      if (value == StrategyParameter.Value) 
       return; 
      StrategyParameter.Value = value; 
      OnPropertyChanged("Value"); 
     } 
    } 

      public StrategyParameterViewModel() 
    { 
     StrategyParameter = new StrategyParameterObject(); 
    } 

    public StrategyParameterViewModel(StrategyParameterObject o) 
    { 
     StrategyParameter = o; 
    } 
} 

回答

1

問題是您正試圖設置與只讀屬性的雙向綁定。您需要爲SelectedStrategy.Parameters添加setter,或者在datagrid itemssource上使用OneWay綁定。

+0

試圖改變,沒有影響 – David

+0

輸出窗口中的任何錯誤? – saus

+0

woops,試一試而不是onewaytosource - 編輯過的文章 – saus

1

關閉我的頭頂,我不要以爲你對你的XAML有任何不妥之處。

數據綁定是非常棘手的。我建議添加PresentationTraceSources以獲取更多調試信息,以瞭解正在發現的內容。這會將有關綁定結果的幾行數據發送到「輸出」窗口。

<ComboBox Height="23" Margin="0,12,0,0" Name="cbxStrats" VerticalAlignment="Top" DisplayMemberPath="Name"> 
     <ComboBox.ItemsSource> 
      <Binding Path="Strategies" PresentationTraceSources.TraceLevel="High"/> 
     </ComboBox.ItemsSource> 
     <ComboBox.SelectedItem> 
      <Binding Path="SelectedStrategy" Mode="TwoWay" PresentationTraceSources.TraceLevel="High"/> 
     </ComboBox.SelectedItem> 
    </ComboBox> 

    <DataGrid AutoGenerateColumns="False" Margin="12,97,14,35" Name="dgSettings"> 
     <DataGrid.ItemsSource> 
      <Binding Path="SelectedStrategy.Parameters" Mode="TwoWay" PresentationTraceSources.TraceLevel="High"/> 
     </DataGrid.ItemsSource> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" IsReadOnly="True"/> 
      <DataGridTextColumn Header="Value" Binding="{Binding Path=Value}" IsReadOnly="False"/> 
     </DataGrid.Columns> 
    </DataGrid> 

此外,WPF檢查可以幫助,因爲你可以在實時運行實際的應用程序時,調整數據綁定表達式。 http://wpfinspector.codeplex.com/

相關問題