调用“编辑”对话框时,WPF组合框所选项目将消失

本文关键字:选项 项目 消失 组合 WPF 编辑 对话框 调用 | 更新日期: 2023-09-27 18:00:33

(修改问题以提高清晰度)

我研究了一整天,没有什么能真正解决我的问题。我有一个组合框,它的来源是一个有名称和代码的"奖金"集合。

<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调用的注释,则问题似乎已修复。但是,我不明白为什么会这样,而且有一种情况我无法修复,即对话框的Save操作中的异常会使组合框再次消失。

  /// <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类型和模式,但没有什么不同。

我认为这与访问对话框时数据上下文的更改有关,但仍在修改组合框的itemSource。但我不确定如何将组合框更新推迟到对话框退出。

如果我在从EditBonus()返回后尝试编辑列表而不调用该OnPropertyChanged(注意空的组合框),则会出现这种情况:https://www.flickr.com/photos/mav_2007/14035815226/in/set-72157644402662271

如果我刚从EditBonus()回来就打电话,情况就是这样:我很想向你展示这一点,但我想我还不够"有信誉":(你可以在我的Flickr页面上看到这个问题的所有图片)

谢谢你能给的任何帮助

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

SelectedBonus的DataContext是BehaviorViewModel,但BonusEditViewModel中还有另一个SelectedBonusProperty。BehaviorViewModel和BonusEditViewModel都派生自ViewModelBase,OnPropertyChanged处理程序在ViewModelBase中实际执行基于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()方法。现在我想知道解决这个问题的最佳方法。。。

调用“编辑”对话框时,WPF组合框所选项目将消失

问题已被验证为与代码结构有关,该代码绑定到名为BehaviorViewModel的ViewModel类中的属性SelectedBonus。但是,该类中的属性实际上是从ViewModel类中名为BonusEditViewModel的属性获取数据的。在BonusEditViewModel类内部调用"OnPropertyChanged("SelectedBonus")对BehaviorViewModel中绑定的属性没有影响。需要重新构造代码,以便BehaviorView Model中的SelectedBonus属性不会引用另一个ViewModel中的属性。这只是结构不好的代码。