在運行時,我想修改DataGrid中某一行的布局(如背景顏色)。
我期望的是:
DataGrid dg = ...;
...
dg.Rows[i].BackGround = ...;
令我驚訝的是,這似乎是不可能的,它甚至走得更遠:
當我將滑鼠懸停在DataGrid上,并按下F12時,我到達了檔案"C:Users...AppDataLocalTempMetadataAsSource......DataGrid.cs",其中提到了DataGrid物件的所有欄位和屬性,但似乎沒有任何DataGridRow存在。我在網上看到了這個問題的解決方案,但它們都是基于設計,在XAML中配置DataGrid ... (我發現這個問題相當復雜)。
由于這是我的第一個WPF應用程式,我想我的思維方式與WPF政策相矛盾,這就是我的問題:
顯然,在運行時根據用戶的互動來修改UI控制元件的一部分,用簡單的方法(不是事件)來描述,似乎違反了WPF政策。 誰能給我解釋一下原因?
編輯,經過一些測驗
(正如你所看到的,與i12相對應的那一行在螢屏上是不可見的。我已經做了多次測驗,它們都產生了相同的結果。
因此,建議的作業方式僅適用于螢屏上實際可見的行。是否有一種方法可以訪問 DataGrid 的行,即使它在螢屏上并非立即可見?
顯然,為了應對這種情況,必須在XAML中進行以下設定:
<DataGrid x:Name="dg_Areas"/span> VirtualizingStackPanel.IsVirtualizing="False"/span> ...
uj5u.com熱心網友回復:
DataGrid是一個ItemsControl。ItemsControl為每個資料項生成一個專案容器。例如,ListBox的默認容器是ListBoxItem。對于DataGrid,它是DataGridRow。
要獲得一個專案的容器或通過專案的索引,你需要使用ItemsControl.ItemContainerGenerator的API:
DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(1) as DataGridRow。
DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;
當UI虛擬化被啟用時,該專案(通過實體或其索引參考)必須被實作。當UI虛擬化被啟用時,只有當專案位于虛擬化控制元件的滾動查看器的視口內時,專案才會被保證實作。
當您處理ItemsControl的Selector.SelectedItem(當選擇由 UI 用戶互動觸發時)時,這將始終是這種情況。
對于在啟用UI虛擬化時的隨機訪問,你可以通過將專案模型以編程方式滾動到視圖中來實作所需的虛擬化容器:
dataGrid.ScrollIntoView(item);
DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;
然而,推薦的方法是避免直接處理專案容器。很少有必要這樣做。相反,你應該處理資料模型。這就消除了處理UI細節,如UI虛擬化和其他UI相關問題。
最好使用XAML來處理容器的渲染細節,如背景顏色或genetal的布局細節。您可以使用樣式、模板和觸發器作為工具來動態地操縱專案容器。
例如,如果您需要根據某個條件來切換容器的Background,您將在XAML中定義一個觸發器(examples)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/312711.html
標籤:

