簡體   English   中英

WPF DataGrid AutoGeneratingColumn 未可靠觸發

[英]WPF DataGrid AutoGeneratingColumn not triggered reliably

我使用 WPF DataGrid,其 ItemsSource 綁定到某些MyResults屬性,其中MyResultsDataTable實例的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM