[英]MVVM LightToolkit and WPF Datagrid AutoGeneratingColumn event
[英]WPF DataGrid AutoGeneratingColumn not triggered reliably
我使用 WPF DataGrid,其 ItemsSource 綁定到某些MyResults
屬性,其中MyResults
是DataTable實例的 DefaultView。 由於在 DataGrid 中標記列標題需要一些靈活性,因此我訂閱了AutoGeneratingColumn
事件來調整這些標題。
查看/XAML:
<DataGrid x:Name="ResultTable" ItemsSource="{Binding MyResults, Mode=OneWay}"
cal:Message.Attach="[Event AutoGeneratingColumn] = [Action CustomizeAutoColumn($this, $eventArgs)]"
AutoGenerateColumns="True"/>
視圖模型/CS:
public DataView MyResults { get { return MyDataTable.DefaultView; } }
public void CustomizeAutoColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) {
e.Column.Header = AdjustHeaderText(e.Column.Header);
}
MyDataTable
的列MyDataTable
可能會動態變化,需要 DataGrid 更新其自動生成的列。 在這種情況下,將觸發 ViewModel( Caliburn.Micro.Screen
子類)中的以下函數:
private void UpdateResultTable() { // not working
NotifyOfPropertyChange(() => MyResults);
}
我的問題是AutoGeneratingColumn
事件永遠不會被這個實現觸發(或者至少從來沒有調用CustomizeAutoColumn
)。 既不是在程序初始化期間(這是我的第一個問題),也不是在調用UpdateResultTable
(第二個問題)。 雖然新行內容按預期添加到視圖中,但列仍保持原樣。
我通過在我的 ViewModel 中獲取 View 對象的句柄,明確重置項目源,找到了一種解決方法。 然而,這顯然很丑陋,尤其是因為它打破了 View/ViewModel 分離。 請注意,由於我使用的是 Caliburn Micro,因此我沒有任何用於視圖 XAML 的代碼隱藏。
private void UpdateResultTable() { // working
var datagrid = VisualTree.FindChild<DataGrid>((DependencyObject)GetView(), "ResultTable");
datagrid.ItemsSource = null;
datagrid.ItemsSource = MyResults;
}
任何想法如何使最初的方法發揮作用? 在此先感謝您的任何建議!
顯式重置項目源。 然而,這顯然很丑陋,尤其是因為它打破了 View/ViewModel 分離。
本身並不丑陋,但需要。
但是為了堅持這種分離,讓 VM 提供一個命令 ( ICommand
) 來請求視圖重置數據上下文,該數據上下文由視圖訂閱。 因此分開。
出於同樣的原因,我已經這樣做了,這里是根據 VM 請求的更改進行重置的代碼:
public MainWindow()
{
DataContext = VM = new CertifyingVM();
VM.CommandRefreshBindings = new OperationCommand(o =>
{
MainAccessionHeader.DataContext =
MainHeader.DataContext = null;
MainAccessionHeader.DataContext =
MainHeader.DataContext = VM;
var currentBatch = VM.CurrentBatch;
MainAccessionHeader.CurrentBatch = null;
MainAccessionHeader.CurrentBatch = currentBatch;
});
VM.LockBatchGui = new OperationCommand(o =>
{ ... }
OperationCommand
是我的ICommand
操作,在我的博客文章Xaml: MVVM Example for Easier Binding 中進行了演示。
您如何觸發它取決於您,只需將 datacontext 的值刪除為 null 然后將其設置回來。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.