自動生成欄目的一個包裹,對象綁定數據網格的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)公開了一個名爲Segments
的ObservableCollection<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; }
}
如果我設置AutoGenerateColumns
到True
,然後我只得到與頭...Model
(即ToString()
-ing模型一列目的)。
我已經衝過課程,並試圖用ModelWrapper模式實現一些東西。我可以根據普通CLRobject的屬性自動生成列嗎?
怎麼樣?我和什麼做錯了? ... 提前致謝。 :-)
_「我ModelWrapper設計導致問題出現,這個」 _ - 我想,如果你解決這個問題,估計連,你會發現更多的道路上。坦率地說,我沒有得到你的設計。它的效率很低(反射),雖然你沒有解釋如何調用SetValue()和GetValue()方法,但我沒有看到你的設計比更傳統的INotifyPropertyChanged更好,實現用於模型本身的基類,而不是模型的一些包裝。你應該首先解決你的問題,包括一個好的[mcve],所以你更清楚你如何在這個角落畫上畫。 –
'ModelWrapper'擴展了實現'INotifyPropertyChanged'的Observable。 ...我一直在關注PluralSight.com的「高級模型治療」課程......(我還沒有完成它)。 – JohnG79
_「ModelWrapper擴展了實現INotifyPropertyChanged的Observable」_ - 是的,我推斷爲。但是'ModelWrapper'有什麼意義呢?它是應該繼承'Observable'的'Segment'類,並且它是,你根本不會有任何問題。 –