WPF列表框命令

时间:2011-07-12 22:16:49

标签: wpf mvvm binding listbox command

好的,简而言之,我的程序有一个客户列表。这些客户都列在列表框中,因此当点击一个客户时,他们的所有信息都会显示在表单上。这通过数据绑定工作,页面上的所有控件都绑定到列表框的selectedItem。

我现在要做的是有一个消息对话框,询问用户在尝试更改选择时是否要保存。如果他们不这样做,我想将其恢复为集合中的原始项目。如果他们点击取消我希望选择重点回到之前选择的项目。我想知道以MVVM方式实现这一目标的最佳方法是什么?

目前我的客户有一个模型,我的虚拟机填充了列表框绑定的客户集合。那么有没有办法处理VM上的选择更改事件,包括能够操作列表框的selectedIndex? 这是我的代码,所以你可以看到我在做什么。

                if (value != _selectedAccount)
                {
                    MessageBoxResult mbr = MessageBox.Show("Do you want to save your work?", "Save", MessageBoxButton.YesNoCancel);
                    if (mbr == MessageBoxResult.Yes)
                    {
                        //Code to update corporate
                        Update_Corporate();
                        _preSelectedAccount = value;
                        _selectedAccount = value;
                    }
                    if (mbr == MessageBoxResult.No)
                    {
                        //Do Stuff

                    }
                    if (mbr == MessageBoxResult.Cancel)
                    {

                        SelectedAccount = _preSelectedAccount;
                        NotifyPropertyChanged("SelectedAccount");
                    }

                }

2 个答案:

答案 0 :(得分:2)

捕获已更改事件的最佳方法是将列表框的SelectedItem绑定到视图模型中的另一个属性,然后在集合上执行您需要执行的操作:

private Customer selectedCustomer;
public Customer SelectedCustomer
{
    get { return selectedCustomer; }
    set
    {
        if (selectedCustomer== value) return;
        selectedCustomer = value;
        RaisePropertyChanged("SelectedCustomer");
        // Do your stuff here
    }
}

这是使用MVVM灯(RaisePropertyChanged)的示例。

答案 1 :(得分:1)

XAML:

<ListBox ItemsSource="{Binding Customers}" SelectedItem="{Binding SelectedCustomer}" DisplayMemberPath="CustomerName"/>

视图模型:

private Customer selectedCustomer;
public Customer SelectedCustomer
{
  get
  {
    return selectedCustomer;
  }
  set
  {
    if (value != selectedCustomer)
    {
      var originalValue = selectedCustomer;
      selectedCustomer = value;
      dlgConfirm dlg = new dlgConfirm();
      var result = dlg.ShowDialog();
      if (!result.HasValue && result.Value)
      {
        Application.Current.Dispatcher.BeginInvoke(
            new Action(() =>
            {
                selectedCustomerr = originalValue;
                OnPropertyChanged("SelectedCustomer");
            }),
            System.Windows.Threading.DispatcherPriority.ContextIdle,
            null
        );
      }
      else
        OnPropertyChanged("SelectedCustomer");
    }
  }
}

here获取/进一步信息。