Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF组合框SelectedItem在调用编辑对话框时消失_C#_Wpf_Binding_Combobox - Fatal编程技术网

C# WPF组合框SelectedItem在调用编辑对话框时消失

C# WPF组合框SelectedItem在调用编辑对话框时消失,c#,wpf,binding,combobox,C#,Wpf,Binding,Combobox,为更清晰起见,对问题进行了修改 我已经研究了一整天,没有什么能真正解决我的问题。我有一个组合框,它的源代码来自一个有名称和代码的奖金集合 <ComboBox Margin="4" SelectedItem="{Binding Path=SelectedBonus, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding Path=Bonuses, UpdateSourceTrigger=Explicit}

为更清晰起见,对问题进行了修改

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

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

现在,我已经尝试更改UpdateSourceTrigger类型和模式,但没有任何改变

我相信这与访问对话框时更改datacontext有关,但仍在修改combobox的itemSource。但我不确定如何推迟组合框更新,直到对话框退出

从EditBonus note返回空组合框后,如果我尝试编辑列表而不调用OnPropertyChanged,则会出现这种情况:

这就是我从EditBonus回来后打电话的样子: 我很想向你们展示这一点,但我想我的声誉还不够好:你们可以从那个链接在我的Flickr页面上看到这个问题的所有图片

谢谢你能给我的帮助

其他信息可能是已查明的罪魁祸首:

SelectedBonus的DataContext是BehaviorViewModel,但在BonusEditViewModel中还有另一个SelectedBonuProperty。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对象上的方法UpdateBuuses。现在我想知道解决这个问题的最好方法

经验证,问题出在代码结构上,该代码绑定到名为BehaviorViewModel的ViewModel类中的SelectedBonus属性。但是,此类中的属性实际上从ViewModel类中名为BonusEditViewModel的属性获取数据。在BonusEditViewModel类内调用OnPropertyChangedSelectedBonus对BehaviorViewModel中的属性绑定没有影响。代码需要重新构造,以便BehaviorViewModel中的SelectedBonus属性不会引用另一个ViewModel中的属性。这只是一个结构糟糕的代码。

问题出在哪里?是因为您无法在清除列表后在UI上将SelectedBonus设置回SelectedBonus。有点像。在EditBonus内部,调用UpdateBunus(清除并重建奖金列表)后,我可以清楚地看到绑定属性bonus和SelectedBonus具有有效值。但是,调用window.ShowDialog会清除UI上的控件,除非我添加了一个额外的OnPropertyChanged方法。
    /// <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");

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