xaml附加财产声明

时间:2010-10-15 12:23:29

标签: wpf attached-properties

我正在创造附属物。我的附加课程是helper:FocusDetail,有2个属性。第二个属性DetailBody类型是对象。我在项目控件上使用此属性

<ItemsControl ItemsSource="{Binding Riches}" BorderThickness="0">
   <ItemsControl.ItemTemplate>
      <DataTemplate>
         <TextBox Text="{Binding TextInfo}"
             helper:FocusDetail.DetailTitle="{StaticResource strTitle}"
             helper:FocusDetail.DetailBody="{Binding Description}"
             />
     </DataTemplate>
   </ItemsControl.ItemTemplate>
</ItemsControl>

这是成功的工作

我正在改变这样的附加值

<DataTemplate>
   <TextBox Text="{Binding TextInfo}"
         helper:FocusDetail.DetailTitle="{StaticResource strTitle}">
       <helper:FocusDetail.DetailBody>
           <Binding Path="Description"/>
       </helper:FocusDetail.DetailBody>
   </TextBox>  
</DataTemplate>

这是工作 我正在改变

<DataTemplate>
   <TextBox Text="{Binding TextInfo}"
         helper:FocusDetail.DetailTitle="{StaticResource strTitle}"
         >
         <helper:FocusDetail.DetailBody>
            <TextBlock Text="Some static text"></TextBlock>
         </helper:FocusDetail.DetailBody>
   </TextBox>  

这很有效。我的最后一次改变是在这里

<DataTemplate>
   <TextBox Text="{Binding TextInfo}"
         helper:FocusDetail.DetailTitle="{StaticResource strTitle}">
        <helper:FocusDetail.DetailBody>
           <TextBlock Text="{Binding Description}"></TextBlock>
        </helper:FocusDetail.DetailBody>
   </TextBox>  
</DataTemplate>

这不行。 Textblock为空。

我正在改变

<TextBlock Text="{Binding Description}"></TextBlock>

<TextBlock Text="{Binding }"></TextBlock>

但是textblock返回Window DataContext类型。已经从Itemscontrol迭代退出。

为什么绑定错误的工作?

如何像上一个代码一样声明附加属性?

我需要附加属性包含可视树控件。

1 个答案:

答案 0 :(得分:1)

您的绑定正在中断,因为它依赖于继承的DataContext,但是通过分配给(非内容)属性而从FrameworkElement DataContext继承结构中取出。

从它看起来你想要做的最好的解决方案可能是使用DataTemplate来定义你的UI元素(这里是TextBlock),并为数据本身提供一个单独的属性,然后可以应用于在树中您希望显示视觉效果的点上具有ContentControl或ContentPresenter的模板(我假设这是为了驱动某种工具提示/弹出窗口)。

     <TextBox Text="{Binding TextInfo}"
         helper:FocusDetail.DetailTitle="{StaticResource strTitle}"
         helper:FocusDetail.DetailBody="{Binding}"
         >
         <helper:FocusDetail.DetailBodyTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Description}"></TextBlock>
            </DataTemplate>
         </helper:FocusDetail.DetailBodyTemplate>
     </TextBox>