【问题标题】:How to bind to a control element within a ResourceDictionary如何绑定到 ResourceDictionary 中的控件元素
【发布时间】:2013-03-07 19:54:41
【问题描述】:

我正在尝试从该控件的 ResourceDictionary 中引用我的 WPF 控件中的元素。这是一个例子:

<UserControl.Resources>
<ResourceDictionary>
    <Behaviors:GridViewInteractionModel x:Key="gridViewInteraction" GridView="{Binding ElementName=myGridView}"/>
</ResourceDictionary>
</UserControl.Resources>
...
<SomeGridView x:Name="myGridView"/>

GridViewInteractionModel 对象上的GridView 依赖属性的值应该是名为myGridViewSomeGridView 对象。

上面的代码不起作用。 {Binding ElementName=myGridView} 没有绑定元素(GridViewInteractionModel 的 SetValue 函数永远不会被调用)。

WPF 运行时错误是:

Cannot find source for binding with reference 'ElementName=myGridView'.
BindingExpression:(no path); DataItem=null; target element is 
'GridViewInteractionModel' (HashCode=15238415); target property is
'GridView' (type 'SomeGridView')

有谁知道如何让控件中的元素绑定到 ResourceDictionary 中资源的属性?

我发现获取属性集的唯一方法是在调用 InitializeComponent() 之后像这样在代码隐藏构造函数中手动设置它:

(Resources["gridViewInteraction"] as GridViewInteractionModel).GridView = FindName("myGridView") as SomeGridView;

但这真的很难看(而且容易出错)。

谢谢。

【问题讨论】:

    标签: wpf binding resourcedictionary


    【解决方案1】:

    不完全确定您要在这里实现什么。这是我如何处理列表视图及其子项的示例:

    <Style x:Key="ListViewStyle" TargetType="ListView">
        <Setter Property="Background">
            <Setter.Value>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="#FFD3D1CF" Offset="0"/>
                    <GradientStop Color="White" Offset="1"/>
                </LinearGradientBrush>
            </Setter.Value>
        </Setter>
        <Setter Property="Effect">
            <Setter.Value>
                <DropShadowEffect Opacity="0.7"/>
            </Setter.Value>
        </Setter>
    </Style>
    <Style x:Key="ListViewItemStyle" TargetType="ListViewItem">
        <Setter Property="Background" Value="#FF494646"/>
        <Setter Property="Foreground" Value="#FFFDFAFA"/>
        <Setter Property="Height" Value="25"></Setter>
        <Setter Property="Cursor" Value="Hand"></Setter>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Foreground" Value="Black"/>
            </Trigger>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Foreground" Value="Black"/>
            </Trigger>
        </Style.Triggers>
    </Style>
    
    
    <ListView x:Name="lvwSettingsYears" x:Uid="lvwSettingsYears" Margin="10,77,10,50"
        Style="{DynamicResource ListViewStyle}"
        ItemContainerStyle="{DynamicResource ListViewItemStyle}"
        SelectionChanged="lvwYears_SelectionChanged">
        <ListView.View>
            <GridView>
                <GridViewColumn x:Name="SettingsYearListviewID" x:Uid="SettingsYearListviewID" DisplayMemberBinding="{Binding id}" Width="0"/>
                <GridViewColumn x:Name="SettingsYearListviewCode" x:Uid="SettingsYearListviewCode" Header="Code" DisplayMemberBinding="{Binding Code}" Width="100"/>
                <GridViewColumn x:Name="SettingsYearListviewDesc" x:Uid="SettingsYearListviewDesc" Header="Description" DisplayMemberBinding="{Binding Description}" Width="300"/>
            </GridView>
         </ListView.View>
     </ListView>
    

    促使我发布此内容的原因是它提到的您的错误消息 目标属性是 'GridView'(输入'SomeGridView')

    我认为它正在寻找控件类型。

    【讨论】:

    • 这也不完全...资源在ResourceDictionary 内。尝试使用 DynamicResource 会出现错误,指出对象需要是 DependencyObject(但 GridViewInteractionModelBehavior&lt;SomeGridView&gt; 对象)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 2013-05-31
    • 2017-06-05
    • 2021-12-13
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    相关资源
    最近更新 更多