我遇到一些麻煩,我的DataGrid:C#WPF DataGrid不動態排序上的數據更新
當我更新一些數據(從模型),它顯示在我的DataGrid,但如果點擊頁眉當我更新現有數據時,對列進行排序時,它開始橫向移動。
這裏的 1例
小號
:
-
如果我添加了新的價值,它不會在年底出現(像它的時候我不排序數據網格),但它顯示在錯誤的地方(每次都是一樣的地方)。 - 如果我更新一個現有的值,那麼當它需要時,順序不會改變。
我見過多次的答案,但有人說DataGridTextColumn不應該是一個問題...
所以我想知道是不是因爲字典...
我知道,與新的第一個問題數據與字典有關。
對象。
public class Player : INotifyPropertyChanged
{
private string _id;
private string _name;
private int _damage;
private int _heal;
private int _dps;
private int _hps;
private int _time = 1;
public Player(string id, string name)
{
_name = name;
_id = id;
}
public event PropertyChangedEventHandler PropertyChanged;
public string Id
{
get { return _id; }
private set
{
_id = value;
}
}
public string Name
{
get { return _name; }
private set
{
_name = value;
NotifyPropertyChanged("Name");
}
}
public int Damage
{
get { return _damage; }
set
{
_damage = value;
NotifyPropertyChanged("Damage");
Dps = _damage/_time;
}
}
public int Heal
{
get { return _heal; }
set
{
_heal = value;
NotifyPropertyChanged("Heal");
Hps = _heal/_time;
}
}
public int Dps
{
get { return _dps; }
private set
{
_dps = value;
NotifyPropertyChanged("Dps");
}
}
public int Hps
{
get {return _hps; }
private set
{
_hps = value;
NotifyPropertyChanged("Hps");
}
}
public int Time
{
get { return _time; }
set
{
_time = value;
Dps = _damage/_time;
Hps = _heal/_time;
}
}
private void NotifyPropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
的ObservableCollection
public sealed class ShortList
{
private static readonly ShortList instance = new ShortList();
private ObservableCollection<Player> playerList = new ObservableCollection<Player>();
private ShortList()
{
}
public static ShortList getShortList
{
get
{
return instance;
}
}
public ObservableCollection<Player> getPlayerList
{
get
{
return playerList;
}
}
public void updatePlayer(string id, string name, int damage, int heal, int time)
{
Player player;
player = findPlayer(id);
if (player != null)
{
player.Damage = player.Damage + damage;
player.Heal = player.Heal + heal;
player.Time = player.Time + time;
}
else
{
player = new Player(id, name);
player.Damage = damage;
player.Heal = heal;
player.Time = time;
playerList.Add(player);
}
}
public void clear()
{
playerList.Clear();
}
private Player findPlayer(string id)
{
foreach (Player p in playerList)
{
if (p.Id == id)
{
return p;
}
}
return null;
}
}
XAML
<DataGrid AutoGenerateColumns="False"Name="playerDataGrid" IsReadOnly="True" ItemsSource="{Binding}">
<DataGrid.Columns>
<DataGridTextColumn Header="Nom" Binding="{Binding Name}" MinWidth="35"/>
<DataGridTextColumn Header="Degats" Binding="{Binding Damage}" MinWidth="45" />
<DataGridTextColumn Header="DPS" Binding="{Binding Dps}" MinWidth="29" />
<DataGridTextColumn Header="Soins" Binding="{Binding Heal}" MinWidth="35" />
<DataGridTextColumn Header="HPS" Binding="{Binding Hps}" MinWidth="29" />
</DataGrid.Columns>
</DataGrid>
窗口
public partial class MiniParser : Window
{
public MiniParser()
{
InitializeComponent();
playerDataGrid.ItemsSource = ShortList.getShortList.getPlayerList;
temporyFill();
}
private void temporyFill()
{
ShortList.getShortList.updatePlayer("1234", "ABCD", 100, 0, 2);
ShortList.getShortList.updatePlayer("1234", "ABCD", 100, 0, 0);
ShortList.getShortList.updatePlayer("123", "ABC", 50, 0, 1);
ShortList.getShortList.updatePlayer("234", "ABC", 0, 50, 1);
ShortList.getShortList.updatePlayer("345", "BCD", 1000, 25, 25);
ShortList.getShortList.updatePlayer("456", "CDE", 250, 0, 25);
}
private void startMI_Click(object sender, RoutedEventArgs e)
{
ShortList.getShortList.updatePlayer("5678", "BABA", 100, 100, 100);
ShortList.getShortList.updatePlayer("1234", "ABCD", 100, 0, 0);
}
}
當然後面的代碼最落後的代碼是有測試目的......但這個想法是模型正在更新,視圖需要反映更改(即使是排序)。
的情況下根據MSDN,復位手段發現「大大改變了集合的內容。」是否有一種更細化的方式讓排序工作?對於小型收藏品,重置似乎沒問題,但對於頻繁更新的大型收藏品可能會造成問題。 – KornMuffin
如果將其從ObservableCollection更改爲BindingList,該怎麼辦?我想BindingList會在單個項目更改時引發收集已更改的事件。 – Cesar