2010-11-28 74 views
0

我已經成功地創建了許多具有各種功能的UserControl,並將每個控件上的DataContext設置爲'this'。當我試圖將它們分成更小的「內部」UserControl時,我總是會遇到問題。問題是這樣的:未設置DataContext時WPF綁定問題

當DataContext設置爲'this'時,我可以在後面的代碼中綁定到Properties - 它們不必是DependencyProperties。當綁定到普通屬性時,程序執行會在後面輸入代碼,我可以在其中執行像切換ListBox項目或其他我不能在xaml中執行的操作。

但是,當我創建一個新的'內部'UserControl在原始控件中託管並將這些屬性移動到內部控件時,我現在必須將它們升級爲DependencyProperties,以便我可以將它們從原始控制。綁定到DependencyProperties時,程序執行永遠不會輸入代碼,對我而言,這是問題所在。順便說一下,我不在內部控件中設置DataContext,而是設置根元素的Name屬性,並在內部控件屬性的綁定中使用ElementName = UserControlName語法。我知道我可以添加一個ValidateValueCallbackHandler到一個DependencyProperty來訪問後面的代碼作爲綁定值的變化,但它必須是一個靜態方法,所以我不能訪問任何非靜態成員(即。我的全班)。

一個例子是我有一個DurationPicker控件,它在ListBoxes中顯示TimeSegments對象。 TimeSegments對象基本上是TimeSegment對象的ObservableCollection,TimeSegment具有StartDate,EndDate和Duration屬性。我在DurationPicker控件中有一個MinutesPerSegment屬性,該屬性綁定到ComboBox的值。它工作完美。我可以更改ComboBox值,並且後面的代碼會將正確數量的TimeSegment對象與正確的新值放在ListBox中。

然後我創建了包含TimeSegments對象和ListBox的內部控件來顯示它。現在MinutesPerSegment屬性必須成爲DependencyProperty,以便我可以從外部控件綁定到它,並且程序執行永遠不會輸入代碼,所以現在我無法更改集合中的TimeSegment對象的數量。

另一件要注意的事情。我可以成功綁定到來自外部控件的內部控件的DependencyProperties - 我可以看到UI中顯示的更改。問題在於我需要執行程序來在更新某些綁定屬性時輸入代碼。

這樣做的正確方法是什麼?非常感謝。

編輯 - 在這個例子中,如果我在外部控件中創建TimeSegments對象並將它們綁定到內部控件,那麼它仍然有效。這是因爲外部控件中的MinutesPerSegment屬性是一個普通屬性...但是,我希望每個TimeSegments對象都在它自己的內部TimeSegmentsRow控件中處理......所以這個問題。

回答

0

首先,您不需要設置DataContextthis只是爲了啓用綁定到您的自定義控件的屬性。如果有人決定爲您的控件設置另一個數據上下文,這是一個壞主意。您可以使用相對綁定。

{Binding Path=PathToProperty, 
     RelativeSource={RelativeSource AncestorType= 
         {x:Type namespaceAlias:typeOfYourControl}}} 

,並在XAML中聲明命名空間別名爲您的自定義控制

xmlns:namespaceAlias="clr-namespace:YourLibraryNamespace;assembly=YourLibraryAssemblyName" 

其次,wpf will not use your property getter and setter to access your dependency properties,這就是爲什麼不應該有超越GetValueSetValue任何額外的邏輯。註冊屬性時可以指定PropertyChangedCallback以在屬性更改時添加一些邏輯。

+0

感謝您提供關於DataContext = this的提示,但不是像命名UserControl根元素和使用ElementName一樣?另外,PropertyChangedCallback委託與ValidateValueCallback一樣是靜態的,所以我無法從那裏訪問類成員。你是否說在不相關的數據綁定屬性更改時無法調用非靜態方法? – Sheridan 2010-11-28 20:51:40