【问题标题】:WPF binding does not workWPF 绑定不起作用
【发布时间】:2011-10-02 14:40:54
【问题描述】:

我的表单中有一些文本框,它们的定义如下:

<TextBox Grid.Column="1" Grid.Row="0" x:Name="titleTextBox" Text="{Binding Path=Title}"  IsEnabled="{Binding Path=IsEditing, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ec:DetailDataControl}}}"/>

但我在运行时收到此错误:

System.Windows.Data 错误:4:找不到与引用“RelativeSource FindAncestor,AncestorType='MyProject.Controls.DetailDataControl',AncestorLevel='1''的绑定源。 BindingExpression:Path=IsEditing;数据项=空;目标元素是'TextBox'(名称='titleTextBox');目标属性是“IsEnabled”(类型“布尔”)

为什么会发生这种情况,我该如何解决?

更新1

IsEditting 定义如下:

public static readonly DependencyProperty IsEditingProperty = DependencyProperty.Register(
            "IsEditing", typeof(Boolean), typeof(DetailDataControl), new PropertyMetadata(false));

public Boolean IsEditing
{
    get { return (Boolean)GetValue(IsEditingProperty); }
    set { SetValue(IsEditingProperty, value); }
}

更新2

XAMl 结构如下:(我删除了一些不相关的部分)

<ad:DocumentContent x:Class="MyProject.Controls.DetailDataControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:ec="clr-namespace:MyProject.Controls"
         xmlns:ecc="clr-namespace:MyProject.Classes.Converters"
         xmlns:ad="clr-namespace:AvalonDock;assembly=AvalonDock"
         mc:Ignorable="d"
         d:DesignHeight="300" d:DesignWidth="300">



<Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
    <Grid.RowDefinitions>
        <RowDefinition Height="20"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition  Height="*"/>
    </Grid.RowDefinitions>
    <WrapPanel HorizontalAlignment="Right"  VerticalAlignment="Stretch" Grid.Row="0" >
        <Button Content="Edit" HorizontalAlignment="Right"  Name="editButton1" VerticalAlignment="Stretch" Click="editButton1_Click" />
    </WrapPanel>

    <Grid x:Name="pDataGrid" Margin="10,10,10,10" Grid.Row="1">
        <Grid.Resources>
            <ecc:InvertBooleanConverter  x:Key="boolConvert"/>
            <Style x:Key="BaseStyle" TargetType="Control">
                <Setter Property="HorizontalAlignment" Value="Stretch"/>
                <Setter Property="VerticalAlignment" Value="Stretch"/>
                <Setter Property="FontFamily" Value="Arial"/>
                <Setter Property="FontSize" Value="12" />

            </Style>

            <Style TargetType="Label" BasedOn="{StaticResource BaseStyle}" >
                <Setter Property="HorizontalAlignment" Value="Stretch"/>
                <Setter Property="VerticalAlignment" Value="Stretch"/>
                <Setter Property="Foreground" Value="Blue"/>
            </Style>
            <Style TargetType="TextBox" BasedOn="{StaticResource BaseStyle}">
            </Style>
            <Style TargetType="DatePicker" BasedOn="{StaticResource BaseStyle}" >
                <Setter Property="HorizontalAlignment" Value="Stretch"/>
                <Setter Property="VerticalAlignment" Value="Stretch"/>
                <Setter Property="IsHitTestVisible"  Value="{Binding Path=IsEditing, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ec:DetailDataControl}}}" />

            </Style>
            <Style TargetType="ComboBox" BasedOn="{StaticResource BaseStyle}">
                <Setter Property="IsEnabled" Value="{Binding Path=IsEditing, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ec:DetailDataControl}}}" />
            </Style>
            <Style TargetType="Button" BasedOn="{StaticResource BaseStyle}">
                <Setter Property="Width" Value="75" />
            </Style>
            <Style TargetType="RowDefinition"   >
                <Setter Property="Height" Value="30" />
                <Setter Property="SharedSizeGroup" Value="RowzSize"/>
            </Style>
            <Style x:Key="LabelColumnStyle" TargetType="ColumnDefinition"  >
                <Setter Property="Width" Value="*" />
                <Setter Property="SharedSizeGroup" Value="LabelColumnszSize"/>
            </Style>
            <Style x:Key="TextColumnStyle" TargetType="ColumnDefinition"   >
                <Setter Property="Width" Value="3*" />

            </Style>
        </Grid.Resources>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Style="{StaticResource LabelColumnStyle}"/>
            <ColumnDefinition Style="{StaticResource TextColumnStyle}"/>


        </Grid.ColumnDefinitions>

        <Label Content="Title" Grid.Column="0" Grid.Row="0" />
        <TextBox Grid.Column="1" Grid.Row="0" x:Name="titleTextBox" Text="{Binding Path=Title}"  IsEnabled="{Binding Path=IsEditing, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ec:DetailDataControl}}}"/>

      </Grid>
    <TabControl Grid.Row="2" HorizontalAlignment="Stretch"  Name="tabControl1" VerticalAlignment="Stretch" >
        <TabItem Header="Address" Name="addresTabItem">
            <DataGrid  Name="addressDataGrid"  AutoGenerateColumns="False" ItemsSource="{Binding}" IsReadOnly="True">
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Path='Order'}" Header="Order" Width="*" />
                    <DataGridTextColumn Binding="{Binding Path='Address1'}" Header="Address1"   Width="3*" />
                    <DataGridTextColumn Binding="{Binding Path='Address2'}" Header="Address2" Width="3*" />
                    <DataGridTextColumn Binding="{Binding Path='Postcode'}" Header="Postcode" Width="*" />
                    <DataGridTextColumn Binding="{Binding Path='TelNo'}" Header="TelNo" Width="*" />
                    <DataGridTextColumn Binding="{Binding Path='MovedToAddressDate', StringFormat={}\{0:dd/MM/yyyy\}}" Header="Moved Date" Width="*" />
                    <DataGridTemplateColumn>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Button Content="Button" Tag="{Binding Path=ID}"  Name="editAddressButton" Click="editAddressButton_Click" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>

            </DataGrid>
        </TabItem>


    </TabControl>

</Grid>

【问题讨论】:

  • 我怀疑它会导致您的问题,但是使用 bool 而不是 Boolean 怎么样?
  • 似乎对我有用,你能发布 DetailDataControl xaml 吗?

标签: wpf data-binding


【解决方案1】:

如果你想做一些类似的事情

<ec:DetailDataControl></ec:DetailDataControl>

        <TextBox Grid.Column="1" Grid.Row="0" x:Name="titleTextBox" Text="{Binding Path=Title}"  IsEnabled="{Binding Path=IsEditing, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ec:DetailDataControl}}}" Width="100"/>

它一定会给你

找不到与引用“RelativeSource”绑定的源 FindAncestor, AncestorType='WpfApplication1.DetailDataControl', 祖先级别='1''。 BindingExpression:Path=IsEditing;数据项=空; 目标元素是'TextBox'(名称='titleTextBox');目标属性是 'IsEnabled'(类型'布尔')

因为相对源查找祖先将始终搜索类型为 ec:DetailDataControl 的父项。它永远不会考虑同级元素(同一级别的元素) 查找祖先将查找类型为 ec:DetailDataControl 的父项 如果它无法找到类型为 ec:DetailDataControl 的父项,那么它将查找下一级父项,就像它会搜索直到它达到了顶级父级,但它从不考虑兄弟姐妹。

这是解决您问题的一种简单方法。

<ec:DetailDataControl x:Name="ddc"></ec:DetailDataControl>

        <TextBox Grid.Column="1" Grid.Row="0" x:Name="titleTextBox" Text="{Binding Path=Title}"  IsEnabled="{Binding Path=IsEditing, ElementName=ddc}" Width="100"/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-21
    • 2012-10-20
    • 2014-08-25
    • 1970-01-01
    • 2014-04-10
    • 2014-09-09
    相关资源
    最近更新 更多