![](/img/trans.png)
[英]WPF DataGrid ObservableCollection Binding - 5 rows with empty collection
[英]WPF Binding to ObservableCollection - only update collection when row is complete
我有一個基本的DataGrid
,用於為我一直在玩的游戲項目創建敵人列表:
<DataGrid x:Name="EnemyGrid" Margin="0,10,0,0" VerticalAlignment="Top" RenderTransformOrigin="8.273,3.781" Height="162" ItemsSource="{Binding}" CanUserReorderColumns="False" ColumnWidth="*" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name, UpdateSourceTrigger=Explicit}" ClipboardContentBinding="{x:Null}" Header="Name"/>
<DataGridTextColumn Binding="{Binding Level, UpdateSourceTrigger=Explicit}" ClipboardContentBinding="{x:Null}" Header="Level"/>
<DataGridTextColumn Binding="{Binding Role, UpdateSourceTrigger=Explicit}" ClipboardContentBinding="{x:Null}" Header="Role"/>
</DataGrid.Columns>
</DataGrid>
DataGrid
綁定到從json
文件讀取的ObservableCollection
:
public partial class MainWindow : Window
{
public ObservableCollection<Enemy> EnemyList;
public MainWindow()
{
InitializeComponent();
var data = JsonHelpers.ReadFile<Enemy>("Enemy.json");
EnemyList = data["Enemy"];
EnemyGrid.DataContext = EnemyList;
}
}
萬一重要,ReadFile方法使用JSON.Net
:
public static Dictionary<string, ObservableCollection<T>> ReadFile<T>(this string fileName)
{
string text = File.ReadAllText(dataPath + fileName);
Dictionary<string, ObservableCollection<T>> data = JsonConvert.DeserializeObject<Dictionary<string, ObservableCollection<T>>>(text);
return data;
}
注意:返回類型為Dictionary<string, ObservableCollection<T>>
因為我需要在json
文件中維護表聲明。 如果我不使用此格式即可將其保留為"TableName" : [{Table}]
,那么我將非常感謝您的輸入。
簡而言之,我遇到的問題與DataGrid
發布更新的時間有關。 根據一些相關問題,我為Enemy
類創建了一個空的構造函數。 一旦在EnemyGrid
的“ Name
字段中鍵入第一個字符,集合EnemyGrid
嘗試更新,並且我會獲得Enemy
類的大多數屬性的默認值。
還要注意,盡管我已經在列上設置了UpdateSourceTrigger=Explicit
,但是只要我開始輸入,集合就會繼續更新。 理想情況下,我希望在該row
添加完值后立即創建該對象,但是一旦cell
被編輯,更新就會發生。
如何使DataGrid
等待執行此更新,以便在創建對象時擁有所有必需的參數?
我不知道您要嘗試做的直接方法。 如果唯一的選擇是在數據網格內進行編輯,則可能需要為與Enemy
具有相同屬性的數據創建一個EnemyViewModel
,但每個屬性EnemyViewModel
以為空。
因此,如果您的Enemy
看起來像這樣:
public class Enemy
{
public string Name { get; set; }
public int Level { get; set; }
public Role Role { get; set; }
}
...您的EnemyViewModel
看起來像這樣:
public class EnemyViewModel
{
public string Name { get; set; }
public int? Level { get; set; }
public Role? Role { get; set; }
}
這樣,表格行中所有內容的默認值將為null
,對用戶而言將顯示為空白/未填充。
一個簡單的LINQ查詢將使您可以將從JSON中讀取的敵人轉換為ObservableCollection<EnemyViewModel>
:
EnemyGrid.DataContext =
new ObservableCollection<EnemyViewModel>(
enemies.Select(x => new EnemyViewModel { Name = x.Name, Level = x.Level, Role = x.Role }));
但是,問題在於未填充的值在它們周圍不會顯示紅色框。 因此,如果您有某種“保存”或“提交”按鈕,則需要檢查視圖模型項中是否為空白值,並發出警告以供用戶修復。
如果您絕對不需要在數據網格內進行編輯,則可以僅將其用於顯示數據並創建一個小型表單,每個字段都具有自己的標簽和TextBox(或最有意義的輸入小部件)。 當用戶提交時,您將其添加到可觀察的集合中,表格將自動更新。 這將需要更多的工作,但是會為您提供對用戶界面的更多控制,並可能帶來更好的用戶體驗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.