2016-01-13 97 views
1

我有一個基本的DataGrid我使用創建的敵人名單的遊戲項目我一直在玩弄:WPF綁定到的ObservableCollection - 只有當行完成更新集合

<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字段中鍵入第一個字符,該集合就會嘗試更新,並獲得Enemy類上大多數屬性的默認值。

另請注意,儘管我已經在列上設置了UpdateSourceTrigger=Explicit,但只要我開始鍵入,集合就會繼續更新。理想情況下,我希望在完成在row中添加值之後創建對象,但更新會在編輯cell後發生。

我怎樣才能讓DataGrid迫不及待地讓我有所有我需要的參數創建對象時執行此更新?

回答

2

我不知道一個直接的方式來做你想做的事情。如果您唯一的選擇是在數據網格中進行編輯,則可能需要爲與您的Enemy具有相同屬性的數據創建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 })); 

,但問題是,填充值不會得到他們周圍的紅色框。所以,如果你有某種「保存」或「提交」按鈕,你需要檢查你的視圖模型項目的空白值,並提出警告,以便用戶解決這個問題。


如果你不絕對需要在數據網絡中編輯,你可以使用它只是顯示你的數據,並創建一個小的形式與各領域取得自己的標籤和文本框(或其他輸入控件品牌最有意義的)。當用戶提交時,你會把它添加到你的可觀察集合中,並且表格會自動更新。這可能會有更多的工作,但會讓您對用戶界面有更多的控制權,並可能帶來更好的用戶體驗。

相關問題