2010-12-11 81 views
0

我遇到了一些附加行爲的問題。我想提供一個綁定到一個依賴項屬性,但該值在ViewModel初始化之前是未知的,所以Setter失敗。在靜態類中定義的附加屬性不起作用

目前,我有這樣的代碼:

  <Style TargetType="{x:Type visi:Chart}"> 
       <Setter Property="att:ChartBehaviour.ExecuteCommandOnDoubleClick" Value="true"/> 
       <Setter Property="att:ChartBehaviour.ShowHideCommand" Value="{Binding OverviewHideCommand}"/> 
      </Style> 

第一二傳手工作完全正常,但第二個不對,因爲OverviewHideCommand將不可用(即是在null的點。樣式應用程序),直到構建後臺對象。

任何關於如何解決這個問題的指針?如果可能,我真的很想留在xaml中。

編輯:

問題apperently處於ShowHideCommand的定義中,這是(類是在不同的命名空間比XAML本身,而是XAML引用命名空間)定義爲附加屬性:

public static class ChartBehaviour 
{ 
    public static readonly DependencyProperty ShowHideCommandProperty = 
     DependencyProperty.RegisterAttached("ShowHideCommand", 
              typeof(ICommand), 
              typeof(Chart), 
              new PropertyMetadata(new DefaultCommand())); 
} 

有趣的是,該物業並沒有出現在Chart類。我應該如何改變它的出現在其中的定義?

回答

0

我已經解決了這個問題。其實,這是兩個問題。

第一項:附屬性定義爲Chart,而不是ChartBehaviour

之後,它解析正確,並開始。然後第二個問題止跌回升 - 在事件中,我指定了以下內容:

static void OnMouseDoubleClick(object sender, RoutedEventArgs e) 
{ 
    var obj = e.OriginalSource as Visifire.Charts.Chart; 

    if (obj == null) 
     return; 

    GetShowHideCommand(obj).Execute(null); 
} 

問題是這一行:var obj = e.OriginalSource as Visifire.Charts.Chart;。該圖表是一個非常複雜的對象,因此e.OriginalSource將返回一個Border元素(或其他位置,具體取決於您雙擊的位置)。正確的成員是Source,這是圖表本身(事件在圖表控件的圖層中冒泡後)。

1

您可以使用恰當命名的觸發器類觸發setter。觸發器(和DataTrigger,其操作方式類似,但在實現INotifyPropertyChanged的非依賴項屬性上)可用於監視特定值的屬性,並且如果值更改爲給定值,則可以執行一系列設置器。

完成此操作的簡單方法是使用監視「backing object」屬性以設置爲非空值的數據觸發器。當這種情況發生時,你的二傳手將會/應該被應用。

+0

你只能比較DataTrigger上的相等性,所以它會很難與非null比較: - /我找到了一個自定義綁定類,但看起來有點超過頂部。 – Femaref 2010-12-11 18:15:19

+0

自定義轉換器?這其實很常見。我正在開發一個重量級的WPF應用程序,其中一些最常見的轉換器布爾型爲可見性,而不是null(帶有反轉參數)等。 – Brandyn 2010-12-14 13:29:29