2009-08-18 234 views
1

WPF XAML,我有一個自定義控件我已經寫了這個包裹查找。 以典型的政府風格,他們有一個查找表,用於所有可能的查找。 我的自定義控件會拋出一個彈出式覆蓋圖,要求他們從列表中的項目中進行選擇。 我的問題與從我的調用表單到我的控件屬性到我的基礎控制虛擬機的數據綁定有關。WPF自定義控件屬性沒有收到數據綁定

我打電話這樣的控制:

<Controls:LookupSelector SelectedLookupValueId="{Binding Path=DataContext.SelectedHarvestMethod, ElementName=SurveyFormWindow, Mode=TwoWay}" /> 

(其他垃圾取出) 在這種情況下,需要明確的DataContext因爲控制的實際的datacontext是它自己的視圖模型。 SelectedHarvestMethod是ViewModel形式的屬性。

它以「新窗體」模式工作,其中控件負責設置其自己的值(該控件包含一個按鈕,當您單擊該按鈕時,會彈出一個按鈕,並選擇所需的查找數據值) 。 正如我所說的那樣工作正常,它甚至會綁定回上面代碼中的'SelectedHarvestMethod'。我可以使用這個很好,並確信我的ViewModel始終具有分配給該屬性的選定ID。

但現在我正在執行「編輯現有表單」模式,我從數據庫加載數據並在視圖模型中設置屬性。因此,我設置了'SelectedHarvestMethod',並且該代碼正常工作(setter中的斷點),但'SelectedLookupValueId'的結果setter未被調用 - 值永遠不會通過。

「SelectedLookupValueId」是在控制的視圖模型一個DP:

public static readonly DependencyProperty SelectedLookupValueIdProperty = 

    DependencyProperty.Register("SelectedLookupValueId", typeof(int), typeof(LookupSelector), new UIPropertyMetadata(0)); 

    public int SelectedLookupValueId 
    { 

     get { return (int) GetValue(SelectedLookupValueIdProperty); } 

     set { SetValue(SelectedLookupValueIdProperty, value); ViewModel.SetPreSelectedLookupValueId(value); } 

    } 

有在輸出窗口或事件日誌中沒有錯誤,或寫在我的鞋的底部。 插入的調試轉換器顯示整數值被明確分配。 正如評論中提到的那樣,虛擬機當然會實現INotifyPropertyChanged,並正確地提升事件。

此外,實際的類型是'用戶控制',而不是自定義控制:它涉及到XAML。

爲什麼不調用我的控件的屬性setter?

+0

我應該補充說我在ViewModel上實現了INotifyPropertyChanged,並在設置VM屬性時將事件返回。但是,希望這已經很明顯,因爲我表示DebugConverter正在被擊中。 – DarkwingDuck 2009-08-18 07:14:05

回答

15

爲什麼不調用我的控件的屬性setter?

我承認我沒有讀過你的整個問題 - 太長了;)但是,你確定綁定失敗嗎?知道WPF優化了依賴屬性訪問,使得CLR包裝器的getter和setter不被調用。相反,它直接調用DependencyObject.GetValueDependencyObject.SetValue,傳入相應的DependencyProperty實例。

因此,您無法在您的CLR屬性上設置斷點以確定d-prop是否正在更改。相反,請在d-prop的元數據中指定更改處理程序。然後在這個處理程序中設置一個斷點。你也可以使用Snoop這樣的工具來查看。順便說一下,這就是爲什麼你的CLR包裝屬性永遠不應該超過呼叫GetValueSetValue。它只是爲了方便而存在的,任何你用這個屬性打包的額外邏輯都不能保證執行。

+1

+1即使在這種特殊情況下這不是問題,未來很可能會有人看這個問題。 – 2009-08-18 13:48:58

+3

+1這是問題所在。相反,我迷上了回調。我能夠用類似於本文中提供的代碼來實現此目的: http://blogs.msdn.com/llobo/archive/2007/03/05/listening-to-dependencyproperty-changes.aspx – DarkwingDuck 2009-08-19 00:39:46

+0

備註:如果傳遞給DependencyProperty.Register的名稱字符串與CLR屬性名稱不同,則DP系統_will_將調用GetValue和SetValue(否則它將仍然表現爲DP)。自定義回調是一個好得多的設計,但是如果你想創建附加的集合屬性,這種攻擊很有用。 – 2010-06-10 10:24:22