2009-03-30 19 views
2

私はComboBoxでDataGridテンプレート列を持っています。値を選択してEnterキーを押すと、バインドされたデータは更新されません(空のセルが表示されます)。ComboBoxでのDataGridTemplateColumnの問題

XAML:

<Window x:Class="WpfGrid2.Window2" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    xmlns:dg="clr-namespace:Microsoft.Windows.Controls;assembly=WpfToolkit" 
    > 

    <Window.Resources> 
     <x:Array x:Key="people" Type="sys:Object" /> 

     <x:Array x:Key="knownLastNames" Type="sys:String"> 
      <sys:String>Smith</sys:String> 
      <sys:String>Johnson</sys:String> 
      <sys:String>Williams</sys:String> 
     </x:Array> 
    </Window.Resources> 

    <StackPanel> 
     <dg:DataGrid x:Name="_grid" ItemsSource="{DynamicResource people}" CanUserAddRows="True" AutoGenerateColumns="False"> 
      <dg:DataGrid.Columns> 

       <dg:DataGridTemplateColumn Header="LastName" MinWidth="100"> 
        <dg:DataGridTemplateColumn.CellEditingTemplate> 
         <DataTemplate> 
          <ComboBox ItemsSource="{DynamicResource knownLastNames}" SelectedItem="{Binding LastName}"></ComboBox> 
         </DataTemplate> 
        </dg:DataGridTemplateColumn.CellEditingTemplate> 
        <dg:DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding LastName}" /> 
         </DataTemplate> 
        </dg:DataGridTemplateColumn.CellTemplate> 
       </dg:DataGridTemplateColumn> 

      </dg:DataGrid.Columns> 
     </dg:DataGrid> 

     <Button>test</Button> 
    </StackPanel> 
</Window> 

コードビハインド:

namespace WpfGrid2 
{ 
    public partial class Window2 : Window 
    { 
     public Window2() 
     { 
      InitializeComponent(); 

      List<Person> people = new List<Person>(); 
      this.Resources["people"] = people; 
     } 
    } 
} 

私はテキストボックスにコンボボックスを変更すると、それが正常に動作します

<TextBox Text="{Binding LastName}" /> 

何が悪いのでしょうか?

答えて

1

これはあなたの問題の実現可能な解決策であるかどうかわかりませんが、コンボボックスのItemsSourceバインディングをStaticResourceに変更すると、バインディングが機能します。

... 

<ComboBox ItemsSource="{StaticResource knownLastNames}" ... /> 

... 

ので、私は(何が起きていること(EditTemplateが原因新しいレコードを提出するアンロードされたとき)コンボボックスがアンロードされると、DynamicResourceが再びリソースを検索しようとし、失敗したということであることをかなり確信していますComboBoxはもはやビジュアルツリーにはなく、ビジュアルツリー上で定義されているリソースは見つかりません)。 ItemsSourceをnullに設定し、SelectedItemをnullに設定してLastNameをnullに設定します。

StaticResourceでは、コレクションはComboBoxが表示される前に一度だけ検索されるため、nullにリセットされません。

+0

あなたの解決策は動作し、説明は意味します。 ItemsSourceを更新可能にする別の方法が必要なようです... – alex2k8

0

「Abe Heidebrecht」の答えに従うと、「knownLastNames」をApplication.Resourcesに移動することもできます。ポイント3を参照してください。

Dynamic resource lookup behavior

  1. プロパティを設定要素 によって定義されたリソース 辞書内の要求されたキーのルックアッププロセスをチェックします。

  2. ルックアッププロセスは、次に 親要素とそのリソース 辞書に、論理ツリー上向き を横断します。これは、 ルート要素に達するまで続きます。

  3. 次に、アプリケーションリソースは、 がチェックされています。アプリケーションリソースは リソース内のリソース 辞書であり、アプリケーションは WPF アプリケーションオブジェクト用に定義されています。

  4. テーマリソースディクショナリは、現在アクティブな テーマの場合、 がチェックされています。テーマが の実行時に変更された場合、値は再評価されます。

  5. システムリソースがチェックされています。

関連する問題