您好我想在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); }
}
答案 0 :(得分:2)
{Binding ElementName=...}
不适合你的原因可能有很多。它通过继承的上下文进行查找,该上下文通过可视元素树传播。如果无法通过绑定到引用的元素遍历可视树,则绑定将失败。例如,如果my:CodeBlockControl
在Resources
内或某个控件的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的答案应该有效。