【问题标题】:Binding doesn't work without specifying the ancestor如果不指定祖先,绑定将不起作用
【发布时间】:2012-04-28 20:41:08
【问题描述】:

如果我指定了祖先,下面的组合框绑定有效,否则无效。如果我不指定祖先,为什么它不起作用?

<wpftoolkit:DataGrid Grid.Row="4" Grid.Column="1" Grid.ColumnSpan="2"
                         Margin="5"
                         BorderBrush="#A6A6A6"
                         BorderThickness="1"
                         ItemsSource="{Binding DebitListing}"
                         AutoGenerateColumns="False"
                         SelectionMode="Single">
        <wpftoolkit:DataGrid.Columns>
            <wpftoolkit:DataGridComboBoxColumn
                Header="{Resx ResxName=MyBooks.Properties.Strings, Key=PartyListing_Party_Label}"
                SelectedItemBinding="{Binding Party, ValidatesOnDataErrors=True}"
                DisplayMemberPath="Name">

                <wpftoolkit:DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="{x:Type ComboBox}">
                        <Setter Property="ItemsSource" Value="{Binding Path=DataContext.CreditedAccounts, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
                    </Style>
                </wpftoolkit:DataGridComboBoxColumn.ElementStyle>
                <wpftoolkit:DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="{x:Type ComboBox}">
                        <Setter Property="ItemsSource" Value="{Binding Path=DataContext.CreditedAccounts, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
                    </Style>
                </wpftoolkit:DataGridComboBoxColumn.EditingElementStyle>

            </wpftoolkit:DataGridComboBoxColumn>

            <wpftoolkit:DataGridTextColumn
                Header="{Resx ResxName=MyBooks.Properties.Strings, Key=PartyListing_Amount_Label}"
                Binding="{Binding Amount, ValidatesOnDataErrors=True}"/>
        </wpftoolkit:DataGrid.Columns>
    </wpftoolkit:DataGrid>

【问题讨论】:

  • 任何人对问题有疑问然后发表评论。
  • 你需要更清楚地解释你的问题是什么。你有一个组合框,“如果祖先写,它可以正常工作,否则它不工作”我不知道这意味着什么。
  • 也许可以举一个 2-3 行的例子来说明什么是有效的,什么是无效的。
  • 我需要知道该行的作用:Value="{Binding Path=DataContext.CreditedAccounts, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}

标签: wpf binding mvvm combobox


【解决方案1】:

你的绑定必须指定哪个祖先的原因是每次你指定一个数据上下文(或者在这种情况下你的DataGrid上的ItemsSource,它隐藏了它的父级的数据上下文。你的组合框没有可以访问布局层次结构中网格上方任何内容的数据上下文。要克服此限制,您可以指定要用于数据上下文的祖先。

【讨论】:

    【解决方案2】:

    您需要引用从其获取所需 DataContext 的祖先的原因是,wpftoolkit 更改了其呈现的子元素上的数据上下文。您会发现几乎所有 ListView/DataGrid 控件都是如此——子元素 DataContext 被更改为引用当前行或列所代表的集合项。如果您希望这些子元素的模板或样式中的某些内容基于控件的 DataContext 之外的属性,则需要使用 RelativeSource Ancestor 来获取它。

    我知道这很令人困惑,因为在基本 XAML 中,子元素总是自动继承其父元素的数据上下文,但 DataContext 就像任何其他 DependencyProperty 一样,复杂的控件可以根据需要对其进行不同的设置。

    如果您愿意,可以通过给父控件(或设置 DataContext 的任何元素)一个名称来简化语法,例如 x:Name='ControlRoot'。然后当你需要回到你的根数据上下文时,你只需要去:

    Value="{Binding ElementName=ControlRoot, Path=DataContext.CreditedAccounts}"
    

    【讨论】:

      猜你喜欢
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多