2009-09-17 54 views
1

您好我想這樣做在XAML如下:WPF:子元素分配給財產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> 

更新: 我現在執行的財產依賴屬性,但它似乎沒有分配occures,雖然我在XAML分配給它。但沒有編制,也沒有運行時錯誤:

在XAML:

在CS
FocusTarget="{Binding ElementName=myCtrl}" 

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

您的「驗證」回調可以以某種方式停止分配?可能值得暫時評論它,看它是否開始工作。 – 2009-09-19 01:41:22

+0

不,它是一種什麼都不做,但總是返回真實的方法 – codymanix 2009-09-19 11:22:03

+0

我試圖快捷地製作一個完整的控件時沒有設置屬性的問題;我的自定義控件來自UIElement。教訓:從手冊派生出來,就像手冊說的那樣! – 2010-03-12 15:15:24

回答

2

可能有一堆原因爲什麼{Binding ElementName=...}不適合你。它通過繼承上下文進行查找,後者通過可視元素樹進行傳播。如果無法通過可視樹從綁定到元素的引用,則綁定將失敗。例如,如果my:CodeBlockControlResources內部或在某個控件的ControlTemplate中聲明,或者如果它與根之間存在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

確保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" /> 
    .. 

+0

我試過了,但是我的屬性值爲null,儘管在xaml代碼中分配了,即使PropertyChangedCallback也不會觸發。什麼可能出錯? – codymanix 2009-09-18 12:40:58

+0

我編輯了我的問題,以顯示我所做的事 – codymanix 2009-09-18 16:16:53

0

綁定語法的格式如下:Target =「{Binding Source}」

該框架要求Target始終是依賴項屬性,而source可以只是一個普通的舊CLR屬性。

馬特漢密爾頓的答案應該工作。

+0

但它不,至少對我來說:(請參閱我編輯我的問題 – codymanix 2009-09-18 16:17:25

+1

當處理綁定問題時,我通常會搜索輸出窗口以查找任何綁定錯誤。它們都以System.Windows.DataError開頭。那麼,Output窗口中是否有錯誤? – Trainee4Life 2009-09-18 16:56:35

+0

不,我沒有看到任何錯誤。 – codymanix 2009-09-18 19:25:07