2009-02-26 79 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" 

就這麼簡單...