2017-09-15 42 views
0

自動生成欄目的一個包裹,對象綁定數據網格的ObservableCollection ModelWrapper <Model>的

我希望有AutoGeneratedColumns =「真」的屬性,但我的我不知道如何與這樣做這個ModelWrapper設計。 (我正在遵循PluralSight.com的「高級模型治療」課程的早期階段)。

<datagrid>處於工作狀態(這已手動定義的列,但我想自動生成列 - 而與此ModelWrapper模式持續):

<DataGrid Grid.Row="0" 
      Grid.RowSpan="2" 
      Grid.Column="1" 
      DockPanel.Dock="Top" 
      ItemsSource="{Binding Segments}" 
      SelectionUnit="FullRow" 
      AutoGenerateColumns="False">  

     <DataGrid.Columns> 
      <DataGridTextColumn Header="Name" Width="1*" Binding="{Binding Model.Name}"/> 
      <DataGridTextColumn Header="Notes" Width="2*" Binding="{Binding Model.Notes}"/> 
     </DataGrid.Columns> 

</DataGrid> 

注:是在DataContext上面的<datagrid>(即關聯的ViewModel)公開了一個名爲SegmentsObservableCollection<ModelWrapper<Segment>>

這裏是用來包裝一個基本類,只有CLR屬性(我大膽地猜測的問題不在這裏 - 或在我的模型定義下文)我ModelWrapper類:

注:Observable實現INotifyPropertyChanged

internal class ModelWrapper<T> : Observable 
{ 
    public ModelWrapper(T model) 
    { 
     if (model == null) 
      throw new ArgumentNullException(nameof(model)); 
     Model = model; 
    } 

    public T Model { get; } 

    protected void SetValue<TValue>(TValue value, [CallerMemberName] string propertyName = null) 
    { 
     var propertyInfo = Model.GetType().GetProperty(propertyName); 
     var currentValue = propertyInfo.GetValue(Model); 
     if (Equals(currentValue, value)) return; 
     propertyInfo.SetValue(Model, currentValue); 
     OnPropertyChanged(propertyName); 
    } 

    protected TValue GetValue<TValue>([CallerMemberName] string propertyName = null) 
    { 
     var propertyInfo = Model.GetType().GetProperty(propertyName); 
     return (TValue) propertyInfo.GetValue(Model); 
    } 
} 

這裏是由ModelWrapper包裹模型類:

internal class Segment 
{ 
    public string Notes { get; set; } 
    public string Name { get; set; } 
} 

如果我設置AutoGenerateColumnsTrue,然後我只得到與頭...Model(即ToString() -ing模型一列目的)。

我已經衝過課程,並試圖用ModelWrapper模式實現一些東西。我可以根據普通CLRobject的屬性自動生成列嗎?

怎麼樣?我和什麼做錯了? ... 提前致謝。 :-)

+0

_「我ModelWrapper設計導致問題出現,這個」 _ - 我想,如果你解決這個問題,估計連,你會發現更多的道路上。坦率地說,我沒有得到你的設計。它的效率很低(反射),雖然你沒有解釋如何調用SetValue()和GetValue()方法,但我沒有看到你的設計比更傳統的INotifyPropertyChanged更好,實現用於模型本身的基類,而不是模型的一些包裝。你應該首先解決你的問題,包括一個好的[mcve],所以你更清楚你如何在這個角落畫上畫。 –

+0

'ModelWrapper'擴展了實現'INotifyPropertyChanged'的Observable。 ...我一直在關注PluralSight.com的「高級模型治療」課程......(我還沒有完成它)。 – JohnG79

+0

_「ModelWrapper擴展了實現INotifyPropertyChanged的Observable」_ - 是的,我推斷爲。但是'ModelWrapper'有什麼意義呢?它是應該繼承'Observable'的'Segment'類,並且它是,你根本不會有任何問題。 –

回答

0

我的問題是,我創建了ModelWrapper類型的ObservableCollections,而不是在我的情況下,SegmentWrapper : ModelWrapper<Segment>

然後我可以從綁定路徑在我的XAML欄中移除Model.,即:

 <DataGrid.Columns> 
      <DataGridTextColumn Header="Name" Width="1*" Binding="{Binding Name}"/> 
      <DataGridTextColumn Header="Notes" Width="2*" Binding="{Binding Notes}"/> 
     </DataGrid.Columns>