2

ComboBoxを含むDataGridテンプレート列があります。値を選択してEnterキーを押すと、バインドされたデータは更新されません(空のセルが表示されます)。

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

ComboBoxをTextBoxに変更すると、正常に機能します

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

なにが問題ですか?

4

2 に答える 2

1

これが問題に対する実行可能な解決策であるかどうかはわかりませんが、Combo-Box の ItemsSource バインディングを StaticResource に変更すると、バインディングが機能します。

...

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

...

ComboBox がアンロードされたとき (新しいレコードを送信したために EditTemplate がアンロードされたとき)、DynamicResource がリソースを再度検索しようとして失敗する (ComboBox がビジュアルに表示されなくなったため) ことが起こっていると確信しています。ビジュアル ツリーでその上に定義されているリソースは見つかりません)。これにより、ItemsSource が null に設定され、SelectedItem も null に設定されるため、LastName が null に設定されます。

StaticResource を使用すると、コレクションは ComboBox が表示される前に 1 回だけ検索されるため、null にリセットされません。

于 2009-03-30T22:09:40.870 に答える
0

別の代替手段(「Abe Heidebrecht」の回答のロジックに従う)は、「knownLastNames」を Application.Resources に移動することです。ポイント#3を参照してください。

動的リソース検索の動作

  1. ルックアップ プロセスは、プロパティを設定する要素によって定義されたリソース ディクショナリ内で要求されたキーをチェックします。

  2. 次に、ルックアップ プロセスは論理ツリーを上方向にトラバースし、親要素とそのリソース ディクショナリに到達します。これは、ルート要素に到達するまで続きます。

  3. 次に、アプリケーション リソースがチェックされます。アプリケーション リソースは、WPF アプリケーションの Application オブジェクトによって定義されるリソース ディクショナリ内のリソースです。

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

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

于 2009-03-30T22:57:56.213 に答える