WPF:将子元素分配给XAML中的属性

时间:2009-09-17 23:45:57

标签: wpf xaml controls properties

您好我想在xaml中执行以下操作:

我的控件类中有一个属性FocusTarget,我想从当前类中分配一个UIElement。这在XAML中是否可行?

<my:BaseControl x:Class="SectionControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
    FocusTarget="myCtrl">   // this fails           
       ..       
       <my:CodeBlockControl x:Name="myCtrl" />           
       ..       
</my:BaseControl>

更新: 我现在将属性实现为依赖属性,但似乎没有任何赋值,尽管我在XAML中分配它。但是没有编译或运行时错误:

xaml中的

    FocusTarget="{Binding ElementName=myCtrl}"

in cs:

   public static readonly DependencyProperty FocusTargetProperty;      

    static BaseControl()
    {
        FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata(null);
        FocusTargetProperty = DependencyProperty.Register("FocusTarget", typeof(FrameworkElement), typeof(BaseControl), metadata, Validate);
   }

    public FrameworkElement FocusTarget
    {
        get { return GetValue(FocusTargetProperty)as FrameworkElement; }
        set { SetValue(FocusTargetProperty, value); }
    }

3 个答案:

答案 0 :(得分:2)

{Binding ElementName=...}不适合你的原因可能有很多。它通过继承的上下文进行查找,该上下文通过可视元素树传播。如果无法通过绑定到引用的元素遍历可视树,则绑定将失败。例如,如果my:CodeBlockControlResources内或某个控件的ControlTemplate内声明,或者在它与root之间有Popup(包括隐式的,{例如由ContextMenu引入的,这就是将要发生的事情。

不幸的是,没有通用的方法可以直接从同一个XAML引用任何其他元素。将在.NET 4.0 XamlReader中使用,但仍然会禁用BAML(因此,对于WPF)。另一种方法是使用资源和{StaticResource}代替:

<my:BaseControl x:Class="SectionControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    FocusTarget="{StaticResource myCtrl}">

  <my:BaseControl.Resources>
    <my:CodeBlockControl x:Key="myCtrl" />
  </my:BaseControl.Resources>

  ...
  <!-- where it originally was -->
  <StaticResource ResourceKey="myCtrl"/>
  ...

</my:BaseControl>

答案 1 :(得分:1)

确保FocusTarget是依赖项属性,并使用元素绑定绑定目标控件:

<my:BaseControl x:Class="SectionControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    FocusTarget="{Binding ElementName=myCtrl}">
    ..
    <my:CodeBlockControl x:Name="myCtrl" />
    ..

答案 2 :(得分:0)

绑定语法的格式为:Target =“{Binding Source}”

框架要求Target始终是依赖属性,而source只能是普通的旧CLR属性。

Matt Hamilton的答案应该有效。