如何解决激活视图后,WPF MVVM加载DataGrid列显示索引
好吧,我已经尝试了很多不同的事情,所以希望我不会弄乱到目前为止我已经尝试过的事情。
作为旁注,我正在与Caliburn Micro合作,并尝试遵循MVVM模式。
我正在尝试在加载viewmodel时以编程方式对数据网格的列进行重新排序(以便用户可以将其设置保存为网格)。
列属性的绑定正在起作用,并反映了它们的当前值。
为测试行为,我以特殊的顺序设置了displayIndexes和ColumnNames的Dictionary
public class OrderSumUpviewmodel : Screen,IHandle<DialogEvent>,IHandle<logoutEvent>
{
public BindableCollection<UIProcessstepModel> Processsteps { get; set; }
public BindableCollection<UIOrderModel> OrdersBc { get; set; }
private List<Predicate<UIOrderModel>> criteria = new List<Predicate<UIOrderModel>>();
private ISaveAndLoadSettings settings;
private IEventAggregator events;
private IWindowManager manager;
private ModifyStatus modifyStatus;
private bool IsCancelationPlausibleThroughDialog;
private string cancelMessage;
public Dictionary<int,string> ColPositions;
public OrderSumUpviewmodel(IEventAggregator events,IWindowManager manager,ISaveAndLoadSettings settings) {
this.settings = settings;
this.events = events;
this.manager = manager;
this.events.Subscribe(this);
this.OrdersBc = new BindableCollection<UIOrderModel>(new UIAllOrdersModel().GetAll());
this.Orders = CollectionViewSource.Getdefaultview(OrdersBc);
this.Processsteps = new BindableCollection<UIProcessstepModel>(UIAllProcessstepsModel.GetAll());
this.modifyStatus = new ModifyStatus();
SetinitialValues();
}
private void SetinitialValues() {
this.ColPositions = new Dictionary<int,string>()
{
[0] = "ColPosDue",[1] = "ColPosCode",[2] = "ColPosstatus",[3] = "ColPosMat",[4] = "ColPosProgress",[5] = "ColPosQuantity",[6] = "ColPosUnit",[7] = "ColPosItemCode",[8] = "ColPosItemName",[9] = "ColPosOrderDate",[10] = "ColPosExpectedFinishDate",[11] = "ColPosOrderedByEmp",[12] = "ColPosDepartment",[13] = "ColPosProcesssteps",[14] = "ColPosAdditions",[15] = "ColPosProject",[16] = "ColPosCommission"
};
if (Activeusermodel.GetAdminPermission()) {
IsCancelButtonVisible = true;
}
deleteFilter();
}
private ICollectionView orders;
public ICollectionView Orders
{
get
{
return this.orders;
}
set
{
this.orders = value;
NotifyOfPropertyChange(() => Orders);
}
}
#region Column Properties
public int ColPosDue
{
get { return GetColPosition("ColPosDue"); }
set
{
ReorderColPositions(value,"ColPosDue");
}
}
public int ColPosstatus
{
get { return GetColPosition("ColPosstatus"); }
set
{
ReorderColPositions(value,"ColPosstatus");
}
}
public int ColPosMat
{
get { return GetColPosition("ColPosMat"); }
set
{
ReorderColPositions(value,"ColPosMat");
}
}
public int ColPosProgress
{
get { return GetColPosition("ColPosProgress"); }
set
{
ReorderColPositions(value,"ColPosProgress");
}
}
public int ColPosCode
{
get { return GetColPosition("ColPosCode"); }
set
{
ReorderColPositions(value,"ColPosCode");
}
}
public int ColPosOrderDate
{
get { return GetColPosition("ColPosOrderDate"); }
set
{
ReorderColPositions(value,"ColPosOrderDate");
}
}
public int ColPosOrderedByEmp
{
get { return GetColPosition("ColPosOrderedByEmp"); }
set
{
ReorderColPositions(value,"ColPosOrderedByEmp");
}
}
public int ColPosDepartment
{
get { return GetColPosition("ColPosDepartment"); }
set
{
ReorderColPositions(value,"ColPosDepartment");
}
}
public int ColPosProcesssteps
{
get { return GetColPosition("ColPosProcesssteps"); }
set
{
ReorderColPositions(value,"ColPosProcesssteps");
}
}
public int ColPosExpectedFinishDate
{
get { return GetColPosition("ColPosExpectedFinishDate"); }
set
{
ReorderColPositions(value,"ColPosExpectedFinishDate");
}
}
public int ColPosQuantity
{
get { return GetColPosition("ColPosQuantity"); }
set
{
ReorderColPositions(value,"ColPosQuantity");
}
}
public int ColPosUnit
{
get { return GetColPosition("ColPosUnit"); }
set
{
ReorderColPositions(value,"ColPosUnit");
}
}
public int ColPosItemCode
{
get { return GetColPosition("ColPosItemCode"); }
set
{
ReorderColPositions(value,"ColPosItemCode");
}
}
public int ColPosItemName
{
get { return GetColPosition("ColPosItemName"); }
set
{
ReorderColPositions(value,"ColPosItemName");
}
}
public int ColPosAdditions
{
get { return GetColPosition("ColPosAdditions"); }
set
{
ReorderColPositions(value,"ColPosAdditions");
}
}
public int ColPosProject
{
get { return GetColPosition("ColPosProject"); }
set
{
ReorderColPositions(value,"ColPosProject");
}
}
public int ColPosCommission
{
get { return GetColPosition("ColPosCommission"); }
set
{
ReorderColPositions(value,"ColPosCommission");
}
}
#endregion
#region Rearrange Columns
private int GetColPosition(string columnName) {
return ColPositions.FirstOrDefault(x => x.Value == columnName).Key;
}
#endregion
}
}
上面的代码是我尝试将正确的列顺序保存在词典中时的第一次尝试。但是,一旦开始加载列值,词典的值就会切换到原来的值,不再适合原始值,因此用户的列顺序混乱了。我想解决这个问题。最初,值可能不会更改,直到数据网格完全加载,然后值才可能更改...
另一种尝试是设置属性的后备字段,并仅在开始时调用方法以从字典中获取所需的显示索引。由于发生了自动重新排序,因此我尝试反映实际的属性状态,并将其与字典中的显示索引进行比较,然后重做每列的设置,直到以正确的方式对其进行排序。
private void SetinitialValues() {
this.ColPositions = new Dictionary<int,[16] = "ColPosCommission"
};
if (Activeusermodel.GetAdminPermission()) {
IsCancelButtonVisible = true;
}
deleteFilter();
SetAllColumnPositions();
}
#region private Members of Column Properties
private int colPosDue;
private int colPosstatus;
...more columns follow
#endregion
public int ColPosDue
{
get { return colPosDue; }
set
{
colPosDue = value;
}
}
public int ColPosstatus
{
get { return colPosstatus; }
set
{
colPosstatus = value;
}
}
...more column properties follow
private void SetAllColumnPositions() {
bool isOrderRearranged;
foreach (int column in ColPositions.Keys.ToList()) {
SetActualColumnorder();
isOrderRearranged = true;
do {
if (ActualColPositions[column] != ColPositions[column]) {
switch (ColPositions[column]) {
case "ColPosDue":
colPosDue = column;
NotifyOfPropertyChange(() => ColPosDue);
isOrderRearranged = false;
break;
//...for each column
default:
break;
}
}
} while (isOrderRearranged);
}
}
private void SetActualColumnorder() {
Type type = this.GetType();
ActualColPositions = new Dictionary<int,string>();
for (int i = 0; i <= 16; i++) {
ActualColPositions.Add(i,"");
}
foreach (PropertyInfo prop in type.GetProperties()) {
if (prop.Name.StartsWith("ColPos")) {
ActualColPositions[int.Parse(prop.GetValue(this).ToString())] = prop.Name;
}
}
}
在设置新的显示索引(从位置16开始)时,我尝试以相反的顺序执行这些步骤。
通过构造函数调用以正确的方式设置显示索引后,将再次设置列属性,但我真的不知道为什么以及何时设置索引。
那是最终值...
任何建议将不胜感激。
谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。