web-dev-qa-db-ja.com

コレクションをWPF:DataGridComboBoxColumnにバインドする方法

私は次のような単純なオブジェクトを持っています:

class Item
{
  ....

  public String Measure { get; set; }
  public String[] Measures {get; }
}

これは、2つのテキスト列とコンボボックス列を持つDataGridにバインドしようとしています。コンボボックス列の場合、プロパティMeasureは現在の選択であり、可能な値を測定します。

私のXAMLは次のとおりです。

<DataGrid Name="recipeGrid" AutoGenerateColumns="False" 
          CellEditEnding="recipeGrid_CellEditEnding" CanUserAddRows="False"
          CanUserDeleteRows="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Food" Width="Auto"
                            Binding="{Binding Food.Name}" />
        <DataGridTextColumn Header="Quantity" IsReadOnly="False"
                            Binding="{Binding Quantity}" />

        <DataGridComboBoxColumn Header="Measure" Width="Auto"
                                SelectedItemBinding="{Binding Path=Measure}"
                                ItemsSource="{Binding Path=Measures}" />

    </DataGrid.Columns>
</DataGrid>

テキスト列は問題なく表示されますが、コンボボックスは表示されません。値はまったく表示されません。バインディングエラーは次のとおりです。

System.Windows.Dataエラー:2:ターゲット要素の管理FrameworkElementまたはFrameworkContentElementが見つかりません。 BindingExpression:Path = Measures; DataItem = null;ターゲット要素は 'DataGridComboBoxColumn'(HashCode = 11497055);ターゲットプロパティは「ItemsSource」(タイプ「IEnumerable」)です。

これを修正するにはどうすればよいですか?

21
georgiosd
3
ThomasAndersson

これが最善の解決策です。

http://wpfthoughts.blogspot.com/2015/04/cannot-find-governing-frameworkelement.html

ここでの考え方は、CollectionViewSourceを静的リソースとして宣言し、それをDataGridComboBoxColumnのItemsSourceに宣言的にバインドすることです。

静的CollectionViewSourceを作成してバインドします。

 <Page.Resources>
     <CollectionViewSource x:Key="Owners" Source="{Binding Owners}"/>
 </Page.Resources>

次に、ターゲットのItemsSourceをバインドします。

ItemsSource="{Binding Source={StaticResource Owners}}"
12
nh43de

メジャーがすべてのオブジェクトに共通である場合は、メジャーを静的にすることができます

public String[] Measures { get; }

そして、xamlは以下に示すようにそれを使用します:

<DataGridComboBoxColumn
    Header="Role"
    SelectedValueBinding="{Binding Role}"
    ItemsSource="{Binding Source={x:Static local:ProjectsDataContext.Roles}}"
    DisplayMemberPath="Name"/>

うまくいけば、それが役立つでしょう。

2
George Lanetz