2009-11-30 68 views
10

MarkupExtension派生類中可能有DependencyProperty嗎?MarkupExtension中的DepedencyProperty

public class GeometryQueryExtension : MarkupExtension 
{ 
    public XmlDataProvider Source { get; set; } 

    public string XPath { get; set; } 

    public static readonly DependencyProperty ArgumentProperty = DependencyProperty.RegisterAttached(
     "Argument", 
     typeof(string), 
     typeof(GeometryQueryExtension)); // this wont work because GeometryQueryExtension is not a DependencyProperty 

    public string Argument 
    { 
     get 
     { 
      return (string)GetValue(ArgumentProperty); // this wont even compile because GeometryQueryExtension doesnt derive from a class which has GetValue 
     } 
     set 
     { 
      SetValue(ArgumentProperty,value);// this wont even compile because GeometryQueryExtension doesnt derive from a class which has SetValue 
     } 
    } 
} 

擴展用於以下代碼片段。

<Label.Content> 
    <local:GeometryQueryExtension Source="{StaticResource shapesDS}"> 
     <local:GeometryQueryExtension.XPath> 
      /Shapes/Geometry/{0} 
     </local:GeometryQueryExtension.XPath> 
     <local:GeometryQueryExtension.Argument> 
      <Binding XPath="Geometry"/> <!-- will throw exception when processing this bind --> 
     </local:GeometryQueryExtension.Argument> 
    </local:GeometryQueryExtension> 
</Label.Content> 

是否有可能建立這樣的擴展,或者我只是吠叫錯誤的樹? (上面的代碼不會編譯和運行,但我在這裏發佈它以最好地說明問題)。

回答

5

不行,你只能依賴屬性添加到那些自DependencyObject派生類,MarkupExtention直接從Object

+0

在那種情況下綁定標記擴展是什麼?它的屬性可以自行綁定,因此它們是依賴屬性。 – Narek 2012-08-21 06:58:57

+0

@Narek - 根據MSDN綁定標記擴展沒有依賴屬性,這是有道理的,因爲你不能不調用DependencyObject.SetValue和DependencyObject.GetValue實現依賴屬性,你不能調用那些沒有從DependencyObject繼承。另外,我現在不能測試它,但我不認爲你可以使用綁定綁定自己的屬性,那是你不能做{Binding Converter = {綁定...}} – Nir 2012-08-21 07:21:55

+0

其實我沒有在WPF中的任何經驗,但在Silverlight 5中,綁定本身的屬性絕對有可能使用綁定。下面是一個例子:「{綁定用戶名,RelativeSource = {RelativeSource FindAncestor,AncestorType = UserControl}}」。 – Narek 2012-08-22 08:21:29

0

啊衍生..它是一個醜陋的問題。但是它有一個簡單的非直觀的答案。 創建另一個標記擴展來獲取靜態資源。 因此,而不是使用{StaticResource shapesDS}

您可以創建一個名爲DataSetLocator

新的MarkupExtension我不會寫代碼,但提供的價值需要根據名稱或其他一些輸入來回報您的數據集。

然後你改變你的XAML讓您的擴展使用的數據集定位器擴展示例Source="{DataSetLocator name=shapesDS }"

這太糟糕了,擴展不延長的DependencyProperty,但他們沒有。

-1

只需使用IMarkupExtension而不是MarkupExtension,並且可以擴展DependencyObject。至少在Silverlight 5中你可以,但我會認爲WPF也有它。

+6

WPF沒有IMarkupExtension。 – Brian 2013-01-08 14:07:43

相關問題