【问题标题】:WPF RelativeSource Cannot find resourceWPF RelativeSource 找不到资源
【发布时间】:2013-11-04 11:08:50
【问题描述】:

我正在使用 WPF 制作自定义控件,我需要检索在后面的用户控件代码中定义的属性,所以我使用了 RelativeSource,但是我得到了这个错误

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.UserControl', AncestorLevel='1''. BindingExpression:Path=LeftColumnHeader; DataItem=null; target element is 'ExtDataGridComboBoxColumn' (HashCode=47761); target property is 'Header' (type 'Object')

我的 XAML 代码(嵌套树)是:

<UserControl x:Class="Administration.Views.UserRoleView"
         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:WPFCtrlDg="clr-namespace:WPFControls.DataGrids;assembly=WPFControls"
         xmlns:WPFCtrl="clr-namespace:WPFControls;assembly=WPFControls"
         xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">

<UserControl.Resources>

    <CollectionViewSource x:Key="AllItemsView" Source="{Binding Path='AllitemsList'}" />

</UserControl.Resources>

<Grid>


    <GroupBox Grid.Row="0" Grid.Column="0" Header="Assigned Elements">
        <WPFCtrlDg:SelfBindingDataGrid x:Name="_sbgAssigned" ScrollViewer.VerticalScrollBarVisibility="Auto"
                     ItemsSource="{Binding Path=Assigned}"
                     SelectedItem="{Binding Path=CurrentAssignedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <WPFCtrlDg:SelfBindingDataGrid.Columns>
                <WPFCtrlDg:ExtDataGridComboBoxColumn Header="{Binding Path=LeftColumnHeader,
                                                         RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}},
                                                          Mode=OneWay, 
                                                          UpdateSourceTrigger=PropertyChanged}" 
                                                          Width="*"/>

在用户控件的代码隐藏中我定义了我的属性

  private string _leftColumnHeader = "TEST";
    public string LeftColumnHeader
    {
        get { return _leftColumnHeader; }
        set { _leftColumnHeader = value; }
    }
}

知道如何检索我的属性以将其用作我的 satagrid 列的头函数吗? 谢谢 安德烈亚

【问题讨论】:

    标签: c# wpf relativesource findancestor


    【解决方案1】:

    使用任一

    RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserRoleView}},
                    Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
    

    或将其添加到您的 UserControl:

    <UserControl
        Name="myControl"
    ...
    

    然后不要使用RelativeSource,而是使用这样的绑定:

    Header={Binding Path=LeftColumnHeader, ElementName=myControl}
    

    但实际上我不太确定您是否仍然能够以您的方式绑定它,因为列标题在绑定时有一些奇怪的规则。检查它:

    stackoverflow.com

    stackoverflow.com

    【讨论】:

    • @andrea 不幸的是,我认为您可以在第一个链接中找到解决方案,问题的底部包含一些答案。
    • 我在代码的某些部分使用了类似的东西,现在有点复杂。我使用 MVVM,如果我在与我的用户控件相关的 Viewmodel 中设置此属性,它会起作用,在这种情况下,代码隐藏 (xaml.cs) 中的属性是因为出于某种原因我更愿意将它们留在那里。所以这样做会在视图模型中搜索,而不是在代码隐藏中
    • @andrea 在做什么?因为我真的不明白你的评论。我所了解的是,您设法绑定了标头,但只有当您在 Viewmodel 中设置属性时才正确?
    • @andrea 没问题,很高兴我能帮上忙。
    【解决方案2】:

    您需要使用 您的 类的名称/类型,而不是您正在扩展的 UserControl 类。试试这个:

    <WPFCtrlDg:ExtDataGridComboBoxColumn Header="{Binding Path=LeftColumnHeader, 
        RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type 
        UserRowView}}, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Width="*"/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      相关资源
      最近更新 更多