簡體   English   中英

WPF綁定到ObservableCollection-僅在行完成時更新集合

[英]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.

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