2014-04-29 65 views
0

(问题修正,更清晰)WPF组合框的SelectedItem消失时,编辑对话框调用

我一直在研究了一整天,没有真正清除了我的问题。我有一个组合框,它从一个名称和一个代码的“奖金”集合中获取它的来源。

<ComboBox Margin="4" 
    SelectedItem="{Binding Path=SelectedBonus, UpdateSourceTrigger=PropertyChanged}" 
    ItemsSource="{Binding Path=Bonuses, UpdateSourceTrigger=Explicit}" 
    DisplayMemberPath="Name" 
    IsSynchronizedWithCurrentItem="True"> 

“奖金”是最初从文件中检索的集合。组合框已正确填充集合,并且我可以选择列表中的任何项目。

不能发布图片,所以这里是链接到加载列表启动:https://www.flickr.com/photos/mav_2007/14059399414/in/set-72157644402662271

现在,下面的代码被称为上下文切换(右键单击组合框,然后选择“编辑奖金“)。但是,这里是我无法理解WPF和绑定发生了什么的情况。

在下面的代码中,名为“EditBonus”的方法重置组合框,重新读取文件以确保没有任何变化(Bonuses.Clear()被调用,然后重新构建,SelectedItem被设置)。但是,只要我调用ShowDialog,组合框选定的项目就会变为空白。如果我对下面的OnPropertyChanged调用取消注释,则问题似乎已解决。但是,我不明白为什么会这样,而且有一种情况我无法解决,对话框的保存操作中的异常使组合框再次消失。

/// <summary> 
    /// Handle the "edit bonus" command 
    /// </summary> 
    void OnEditBonus() 
    { 
     // only edit this is we have a bonus selected 
     if (bonusEditViewModel.EditBonus()) 
     { 
      // OnPropertyChanged("SelectedBonus"); 
      var window = new BonusEditDialog(bonusEditViewModel); 
      window.ShowDialog(); 
      // OnPropertyChanged("SelectedBonus"); 

     } 
    } 

而且方法EditBonus()

internal bool EditBonus() 
    { 
     bool success = false; 

     if (SelectedBonus != null) 
     { 
      var originalCode = SelectedBonus.Code; 
      success = UpdateBonuses(originalCode); 
      if (success) 
      { 
       if (SelectedBonus.Code == originalCode) 
       { 
        BonusName = SelectedBonus.Type; 
        originalBonusName = BonusName; 
        CloseWindow = false; 
       } 
      } 
     } 
     return success; 
    } 

现在,我已经试图改变UpdateSourceTrigger类型和模式并没有什么有差别。

我相信它与访问对话框时改变datacontext有关,但仍然对组合框的itemSource进行修改。但我不知道如何推迟组合框更新,直到对话框退出。

这是什么样子,如果我尝试不调用该OnPropertyChangedEditBonus()回国后编辑列表(注意空组合框): https://www.flickr.com/photos/mav_2007/14035815226/in/set-72157644402662271

这是什么样子,如果我打这个电话从EditBonus()返回: 我很想向你展示这一点,但我想我不是“有信誉的”足够:(:(你可以从我的Flickr页面上看到这个问题的所有图像)

感谢您给予的任何帮助

附加信息(可能的罪魁祸首确定):

SelectedBonus的DataContext是BehaviorViewModel,但BonusEditViewModel中还有另一个SelectedBonusProperty。 BehaviorViewModel和BonusEditViewModel派生自ViewModelBase,它是OnPropertyChanged处理程序基于ViewModel类型实际执行处理程序的位置。 BehaviorViewModel是绑定到窗体的东西。在BonusEditViewModel中调用OnPropertyChanged没有效果,因为它是不同的上下文。

这里是内部BehaviorViewMode的SelectedBonus属性:

/// <summary> 
    /// Expose the bonus information from the bonusEditViewModel 
    /// </summary> 
    public Bonus SelectedBonus 
    { 
     get 
     { 
      return bonusEditViewModel.SelectedBonus; 
     } 
     set 
     { 
      bonusEditViewModel.SelectedBonus = value; 
      if (behavior != null && bonusEditViewModel.SelectedBonus != null) 
      { 
       behavior.Items[BehaviorItem.THEME_ID].Value = bonusEditViewModel.SelectedBonus.Code.ToString(); 
      } 
      if (bonusEditViewModel.SelectedBonus != null) 
      { 
       ThemeShortname = bonusEditViewModel.SelectedBonus.Type; 
      } 
      OnPropertyChanged("SelectedBonus"); 

     } 
    } 

这里是内部BonusEditViewModel的SelectedBonus代码:

 /// <summary> 
    /// The currently selected bonus which will be edited by the dialog 
    /// </summary> 
    public Bonus SelectedBonus 
    { 
     get { return selectedBonus; } 
     set 
     { 
      selectedBonus = value; 
      OnPropertyChanged("SelectedBonus"); 
     } 
    } 

功能OnEditBonus()存在BehaviorViewModel内,并呼吁BonusEditViewModel对象上的UpdateBonuses()方法。现在我想知道解决这个问题的最佳方法...

+0

这是什么问题?您是否无法在清除列表后,在UI上选择SelectedBonus? – ethicallogics

+0

在EditBonus内部,在调用UpdateBonuses()(清除并重建奖励列表)后,我可以清楚地看到绑定属性Bonuses和SelectedBonus具有有效值。但是,除非添加一个额外的OnPropertyChanged方法,否则调用window.ShowDialog()会清除UI上的控件。 –

回答

0

该问题已经通过代码结构验证,该代码的结构与ViewModel类中名为BehaviorViewModel的SelectedBonus属性绑定。然而,这个类中的属性实际上是从ViewModel类中的一个属性获取其数据,称为BonusEditViewModel。在BonusEditViewModel类中调用“OnPropertyChanged(”SelectedBonus“)对BehaviorViewModel中绑定的属性没有影响,需要对代码进行重构,以便BehaviorViewModel中的SelectedBonus属性不会引用另一个ViewModel中的属性。 。