2009-02-26 18 views
15

WPFコンボボックスをWPFToolkit Datagrid内で動作させようとしていますが、すべてのピースを正しく配置するのに問題があります。私もコンボボックスのためのItemsSourceを提供し、私のコードビハインドのページプロパティを持っているWPF ComboBoxがソースを更新していません


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 }; 
} 

:私は、エンティティへのLINQを使用している、と私は、LINQクエリの結果に、全体のDataContextを設定しています:


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点まで、コンボボックスに表示されますフォーカスがコンボボックスを離れる。その時点で、表示された値は元の値に戻り、新しく選択された値には戻りません。私はSelectedValueの代わりにSelectedItemを使ってみましたが、ComboBoxに表示されない選択値で終わります。私はちょっと謎めいています。このビットが機能しているようです。

編集3/2/09:私はまだこれ以上困惑しています。私のデータグリッドでは、単純なデータ列(「DataGridTextColumn」など)は、想定どおりの基礎データソースを更新することに注意してください。しかし、私のテンプレート化された列( "DataGridTemplateColumn")またはComboBox列( "DataGridComboBoxColumn")の更新はうまくいきません。基礎となるデータソースは決して更新されません。確かに他の人々がWPF.Toolkitデータグリッドを使用しようとしましたが、このシナリオはうまくいきましたが、そこにあるすべてのサンプルコードを見てきました。解決策)、私はなぜこれが動作していない私の頭を傷つけている。

どのような考えですか?

答えて

20

私は(私は欲求不満の日々を過ごした上で)同様の問題を抱えていた、と私はSelectedValueUpdateSourceTriggerを変更するPropertyChangedそれを固定に結合することがわかりました。なぜか分かりませんが、私にとっては、この変更を行うまで、データソースは更新されていませんでした。

<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に設定されていることを示します。 –

+0

実際には、私はテキストボックスを使用すると私のためにLostFocusにデフォルト設定されていません。しかし、これをPropertyChangedに設定するとこれを修正します。 – tcables

+0

優秀!! SamItedはSelectedItemバインディングでも機能します – Adarsha

5

私はこれを得ることができました。しかし、私はちょっとしたものを別に設定しました。

  1. ViewModelを作成して、Viewとの契約として機能させました。正しくコンボボックスのバインドを持つ:私はあなたのデータソースは、私は基本的な問題をシミュレートするために、私自身が作ったかわからなかったので、私が代わりにComboBox.SelectedValueプロパティ

のComboBox.SelectedItemプロパティにバインド

  • 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; 
         } 
        } 
    } 
    

    、私は適切に構築RootViewModelのインスタンスであることを私の窓ののDataContextを設定します。私はボンネットの下にあるため、私のエンティティのEqualsメソッドをオーバーライドしていることを確認する必要があり、適切に結合させるのSelectedItemためには

    ​​

    は、WPFはのSelectedItemであるかない者を決定するために、このメソッドを使用しています。私はこれが基本的にSelectedItemの代わりにSelectedValueにバインドしようとした最初からあなたの問題だと思う。

  • 0

    あなたは、XAMLで

    IsSynchronizedWithCurrentItem = "True" 
    

    を追加する必要があります。

    それは簡単です...

    +2

    これを 'False'に設定すると、私と同様の問題が解決されました。 –

    関連する問題