当前位置:  开发笔记 > 编程语言 > 正文

WPF ComboBox没有更新源代码

如何解决《WPFComboBox没有更新源代码》经验,为你挑选了2个好方法。

我正在尝试使用WPF组合框(在WPFToolkit Datagrid中),并且我无法正确对齐所有部分.我正在使用Linq to Entities,我将整个datacontext设置为Linq查询的结果:

private void LoadDonationGrid()
{
    donationGrid.ItemsSource = from donations in entities.Donation
                   .Include("Family")
                   .Include("PledgeYear")
                   .Include("DonationPurpose")
               from donationPurposes in entities.DonationPurpose
               select new { donations, donationPurposes };
}

我的代码隐藏中也有一个页面属性,它为组合框提供了ItemsSource:

private IEnumerable donationPurposeList;
public IEnumerable DonationPurposeList
{
    get
    {
        if (donationPurposeList == null)
        {
            donationPurposeList = from dp in entities.DonationPurpose
                                  select dp;
        }
        return donationPurposeList.ToList();
    }
}

组合框的XAML如下所示:


    
        
            
        
    
    
        
            
        
    

一切似乎都正常工作,即适当的值显示在ComboBox中,直到焦点离开ComboBox的点.此时,显示的值将返回原始值,而不是新选择的值.我已经尝试使用SelectedItem而不是SelectedValue,但最终选择的值不会显示在ComboBox中.我有点神秘:似乎这一点应该有效.

编辑于2009年3月2日:我仍然对此感到困惑.我应该注意,在我的datagrid中,任何简单的数据列(例如,"DataGridTextColumn")都会像您期望的那样更新底层数据源.但是对我的任何模板化列("DataGridTemplateColumn")或ComboBox列("DataGridComboBoxColumn")的任何更新都不起作用:底层数据源永远不会更新.当然其他人都试图使用WPF.Toolkit数据网格并使这个场景起作用 - 但我已经查看了所有的示例代码,而且我基本上都在做它所说的事情(在我的约束下)解决方案),所以我在摸不着为什么这不起作用.

有什么想法吗?



1> Simon MᶜKenz..:

我有一个类似的问题(关于这一点我花了无奈天),我发现改变UpdateSourceTriggerSelectedValue结合PropertyChanged固定它.我不知道为什么,但对我来说,数据源在我做出这个改变之前没有更新.




2> markti..:

我能够让这个工作.但我的设定有点不同.

    我创建了一个ViewModel作为View的契约.

    我绑定到ComboBox.SelectedItem属性而不是ComboBox.SelectedValue属性

由于我不知道你的数据源是什么,我自己编写了模拟基本问题:在WPF DataGrid中正确绑定comboBox.

这是我的视图模型的组成:

public class RootViewModel
{
    public List USStates { get; set; }
    public List Customers { get; set; }

    public ViewModel()
    {
        Customers = new List();
        Customers.Add(new Customer() { FirstName = "John", LastName = "Smith", State = new State() { ShortName = "IL" } });
        Customers.Add(new Customer() { FirstName = "John", LastName = "Doe", State = new State() { ShortName = "OH" } });
        Customers.Add(new Customer() { FirstName = "Sally", LastName = "Smith", State = new State() { ShortName = "IN" } });

        USStates = new List();
        USStates.Add(new State() { ShortName = "OH" });
        USStates.Add(new State() { ShortName = "IL" });
        USStates.Add(new State() { ShortName = "IN" });
    }
}

public class Customer
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public State State { get; set; }
}

public class State
{
    public string ShortName { get; set; }

    public State() 
    {
        ShortName = string.Empty;
    }

    public override bool Equals(object obj)
    {
        if (obj is State)
        {
            State otherState = obj as State;
            return ShortName.Equals(otherState.ShortName);
        }
        else
        {
            return false;
        }
    }
}

在开始之前,我将我的Window的DataContext设置为我正确构造的RootViewModel的实例.


            
                
                    
                        
                            
                        
                    
                    
                        
                            
                        
                    
                
            
        

为了使SelectedItem正确绑定,我需要确保我已经覆盖了我的实体上的Equals方法,因为WPF正在使用此方法来确定谁是SelectedItem.我认为这从根本上说是你的问题从一开始就导致你尝试绑定到SelectedValue而不是SelectedItem.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有