2009-02-26 78 views
15

我试图让一个WPF组合框工作(WPFToolkit Datagrid内),并且我无法正确地对齐所有块。我使用LINQ到实体,而我总的DataContext设置到LINQ查询的结果:WPF组合框不更新源


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看起来是这样的:

<tk:DataGridTemplateColumn Header="Purpose"> 
    <tk:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Path=donations.DonationPurpose.Description, Mode=TwoWay}" /> 
     </DataTemplate> 
    </tk:DataGridTemplateColumn.CellTemplate> 
    <tk:DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <ComboBox Name="cboDonationPurpose" 
       SelectedValue="{Binding Path=donations.DonationPurposeID, Mode=TwoWay}" 
       ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type Page},Mode=FindAncestor},Path=DonationPurposeList}"         
       DisplayMemberPath="Description" 
       SelectedValuePath="DonationPurposeID" 
         /> 
     </DataTemplate> 
    </tk:DataGridTemplateColumn.CellEditingTemplate> 
</tk:DataGridTemplateColumn> 

,一切似乎正常工作,即合适的值显示在组合框中,说得最多的点WH焦点离开组合框。此时,显示的值将返回到原始值,而不是新选择的值。我尝试过使用SelectedItem而不是SelectedValue,但是最终的选择值并未显示在ComboBox中。我有点神秘:似乎这个位应该工作。

编辑3/2/09:我仍然困惑这一点。我应该注意到,在我的数据网格中,任何简单的数据列(例如“DataGridTextColumn”)都会像您期望的那样更新底层数据源。但是对我的任何模板列(“DataGridTemplateColumn”)或ComboBox列(“DataGridComboBoxColumn”)的任何更新都不起作用:底层数据源永远不会更新。当然,其他人试图使用WPF.Toolkit数据网格,并得到这个场景的工作 - 但我已经看了所有的示例代码,我基本上正在做的事情(在我的约束之内解决方案),所以我抓我的头为什么这不起作用。

有什么想法?

回答

20

我有一个类似的问题(我花了几天的挫折),并且我发现改变SelectedValue绑定到PropertyChangedUpdateSourceTrigger修复了它。我不知道为什么,但对我而言,在我进行此更改之前,数据源并未更新。

<ComboBox 
    ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UpdateTypesManager:MainWindow}}, Path=CardinalityTypes}" 
    DisplayMemberPath="CardinalityType" 
    SelectedValue="{Binding CardinalityTypeId, UpdateSourceTrigger=PropertyChanged}" 
    SelectedValuePath="Id" /> 
+0

我有完全相同的问题。几个小时一直在搞这个。我将绑定更改为TwoWay,尝试更改其他东西。[MSDN](http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger.aspx)似乎表明在诸如文本等情况下默认设置为LostFocus。 – 2011-09-20 20:15:26

+0

实际上,当我使用文本框时,它并不是默认为LostFocus。将其设置为PropertyChanged确实解决了这个问题。 – tcables 2012-03-01 18:55:07

5

我能够得到这个工作。但是我的设置稍有不同。

  1. 我创建了一个ViewModel作为View的契约。
  2. 我绑定到ComboBox.SelectedItem属性,而不是ComboBox.SelectedValue物业

因为我不知道你的数据源是我做了我自己来模拟的基本问题:正确有一个ComboBox绑定在WPF DataGrid中。

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

public class RootViewModel 
{ 
    public List<State> USStates { get; set; } 
    public List<Customer> Customers { get; set; } 

    public ViewModel() 
    { 
     Customers = new List<Customer>(); 
     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<State>(); 
     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; 
     } 
    } 
} 

在我们开始之前,我把我的窗口的DataContext的是我正确构造RootViewModel的一个实例。

​​

为了使的SelectedItem正确绑定我需要确保,因为引擎盖下,我已经重写我的实体Equals方法,WPF是使用这种方法来确定谁是的SelectedItem与否。我认为这从根本上是从一开始导致你尝试绑定到SelectedValue而不是SelectedItem的问题。

0

您需要在XAML中添加

IsSynchronizedWithCurrentItem = "True" 

就这么简单...