0

ViewModel のプロパティにバインドする DataGrid の ItemsSource プロパティがあります。

<DataGrid ItemsSource="{Binding Path=ExcelData}" ColumnHeaderStyle="{DynamicResource ColumnHeaderStyle}" Grid.Row="1" Margin="0 10 0 10" Visibility="{Binding DisplayGridView, Converter={StaticResource booltovisibility}}" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="False" />

ご覧のとおり、DataGrid には特別なヘッダー テンプレートがあります。

<Style x:Key="ColumnHeaderStyle" TargetType="{x:Type DataGridColumnHeader}">
        <Setter Property="VerticalContentAlignment" Value="Center" />
        <Setter Property="Background" Value="{x:Static pm:MetroColors.FeatureBrush}" />
        <Setter Property="Foreground" Value="White" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="DataGridColumnHeader">
                    <Border BorderThickness="2" CornerRadius="5" Background="{x:Static pm:MetroColors.FeatureBrush}" BorderBrush="{x:Static pm:MetroColors.FeatureBrush}">
                        <StackPanel>
                            <ComboBox ItemsSource="{Binding ComboDataSource}" DisplayMemberPath="Text" SelectedValuePath="Name" ext:ComboBoxExtensions.ComboBoxName="{TemplateBinding Content}" SelectionChanged="ComboBox_SelectionChanged" />
                            <Label Content="{TemplateBinding  Content}" />
                        </StackPanel>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

問題 : コンボボックスがいっぱいではありません。

私はこの出力を持っています:

System.Windows.Data Error: 40 : BindingExpression path error: 'ComboDataSource' property not found on 'object' ''String' (HashCode=752763509)'. BindingExpression:Path=ComboDataSource; DataItem='String' (HashCode=752763509); target element is 'ComboBox' (Name=''); target property is 'ItemsSource' (type 'IEnumerable')

私はそれに同意します!列ヘッダーにバインドされたオブジェクトには、ComboDataSource という名前のプロパティはありません。

コンボボックスを別のソースにバインドするにはどうすればよいですか?

4

1 に答える 1

1

ツリーをたどって別の適切な Source を見つけることができます。そのために、このように FindAncestor で RelativeSource マークアップを使用できます。

ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.ComboDataSource}"

もちろん、これはDataGridの祖先に がComboBoxあり、DataGridsDataContextが設定され、 というプロパティが含まれていることを意味しますComboDataSource

コンボボックスの静的データに対して私が気に入っている別の解決策は、バインディングの新しいソースを設定することです

ItemsSource = "{Binding Source={x:Static my:StaticData.MyEntries}}"

シングルトンマネージャーを使用する場合、これを行うことができます

ItemsSource = "{Binding Source={x:Static my:StaticData.Instance}, Path=MyEntries}"

最後に、DataObjectProvider を使用できますが、私自身は実際に使用したことはありませんが、これで何ができるかを説明する必要があります。

于 2013-01-16T09:42:13.187 に答える