在模板和ItemsSource属性上绑定wpf

时间:2013-01-16 09:32:48

标签: wpf binding controltemplate

我将DataGrid的ItemsSource属性绑定到我的ViewModel的属性!

<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的属性。

如何将我的组合框绑定到其他来源?

1 个答案:

答案 0 :(得分:1)

你可以通过走树来找到另一个合适的Source,因为你可以像这样使用FindAncestor的RelativeSource标记

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

这当然意味着DataGrid的祖先中存在ComboBox并且DataGrids DataContext已设置且包含名为ComboDataSource的属性。< / p>

我喜欢组合框中的静态数据的另一个解决方案是为绑定设置新的源

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

如果您使用单身经理,则可以执行此操作

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

最后你可以使用DataObjectProvider,虽然我自己从未真正使用它,但是this应该解释你可以用它做什么。