2012-02-28 25 views
2

綁定到的DependencyProperty我有兩個不同的用戶控件形式 - 一個包含一個Telerik的RadGridView,另一個是包含Telerik的的DataForm。在用戶控件

網格用戶控件綁定到包括暴露的網格綁定到項目集合的屬性一個ViewModel。

當我在窗體綁定到財產,一切工作正常。
但我需要訪問窗體控件​​中的其他信息,它們不屬於網格控件的視圖模型。

所以我想我會一個屬性添加到窗體用戶控件,並將其綁定到項目集合:

<local:FormControl x:Name="formControl" 
    ItemsSource="{Binding items}" 
/> 

在窗體的代碼隱藏,我添加了一個普通財產:

private object itemsSource; 
public object ItemsSource 
{ 
    get { return this.itemsSource; } 
    set { this.itemsSource = value; } 
} 

這當然不起作用。我遇到了必須使用DependencyProperty的錯誤。我認爲這是令人放心的 - 頁面實際上是試圖綁定到我認爲應該的屬性。

所以我轉換這對DependencyProperty:

public static DependencyProperty ItemsSourceProperty = 
    DependencyProperty.Register("ItemsSource", typeof(object), typeof(FormControl)); 

public object ItemsSource 
{ 
    get { return GetValue(ItemsSourceProperty); } 
    set { SetValue(ItemsSourceProperty, value); } 
} 

這編譯和無差錯運行。當然,除了該控件的視圖模型沒有任何項目。所以接下來是試圖ItemsSource屬性傳遞到表單控件的視圖模型:

public FormControl() 
{ 
    InitializeComponent(); 
    this.DataContext = new FormControlVM(this.ItemsSource); 
    ... 

這沒有奏效。當FormControl()被構造時ItemsSource爲null。所以我向viewmodel添加了一個setItemsSource()方法,並在ItemsSource屬性的set函數中調用它。這也沒有奏效。 xaml顯然是綁定到屬性的,但似乎沒有調用屬性的set函數。

所以我決定聽ValueChanged事件,上的DependencyProperty:

public FormControl() 
{ 
    InitializeComponent(); 
    this.DataContext = new FormControlVM(); 
    DependencyPropertyDescriptor prop = 
      DependencyPropertyDescriptor.FromProperty(FormControl.ItemsSourceProperty, this.GetType()); 
    prop.AddValueChanged(this, delegate 
    { 
     FormControlVM formControlVM = (FormControlVM)this.DataContext; 
     formControlVM.setItemsSource(this.ItemsSource); 
    }); 
    ... 

,它仍然無法正常工作。 ValueChanged委託似乎永遠不會被調用。

這似乎是它應該是一個簡單的事情,但我沒能找到上線的例子,我嘗試了各種組合我所能想象的。

任何想法,我應該怎麼處理呢?在結合============

威爾

============附加信息被要求對不綁定的XAML信息。

如果我把這個包含用戶控制頁面,結合用戶控件的頁面視圖模型:

<local:FormControl x:Name="formControl" 
     Grid.Column="2" 
     DataContext="{Binding}" 
     /> 

然後這個用戶控件,綁定用戶控件到窗體itemsCollection頁面的viewmodel:

<telerik:RadDataForm 
     ItemsSource="{Binding itemsCollection}" 
     Header="View Item:" 
     CommandButtonsVisibility="None" 
     AutoGenerateFields="False" 
     /> 

然後一切正常。

但問題是,我無法將用戶控件綁定到頁面的視圖模型。我需要讓用戶控件的視圖模型公開該頁面的視圖模型不應該看到的信息。

而我不能讓用戶控件中的表單到達用戶控件的外部,並綁定到頁面viewmodel上的屬性。這是對封裝的違反,這將使得使用不同頁面上的用戶控件變得更加複雜,並且嚴重限制了我將來如何修改控件的內部。 (頁面不應該知道用戶控件內的任何控件,用戶控件中的控件不應該知道頁面的任何內容。)

當我在頁面中包含用戶控件時,我想綁定用戶控制到頁面視圖模型的屬性,並且我希望用戶控件中的任何控件綁定到用戶控件的屬性或用戶控件的視圖模型的屬性。

我認爲這是一個相當常見的事件。但是我還沒有找到任何可以做到的例子。

+1

Yeesh。雖然很高興知道你是如何到達兔子洞的底部的,但我無法弄清楚爲什麼*你失敗了。你想在你的FormControl *裏面完成什麼,你需要給它添加ItemsSource屬性,以及你想要在你的UserControl中使用該對象做什麼? – Will 2012-02-28 18:17:58

+0

FormControl包含一個窗體,並且該窗體具有一個ItemsSource屬性。我想要宣傳該屬性,以便當我將FormControl放在頁面上時,我綁定到FormControl上的屬性,而不是伸入控件並綁定到其中的某個東西。 (得墨忒耳法)。 – 2012-02-28 19:12:01

+0

你試圖將所有東西綁定在一起,綁定不起作用但是我不認爲有人可以說,因爲你添加了所有的東西,除了你希望工作的綁定沒有的xaml。 – Will 2012-02-28 19:13:16

回答

3

重申問題:我有一個UserControl,它包含一個嵌入式Telerik DataForm控件。我需要將嵌入式DataForm的ItemsSource屬性綁定到放置我的UserControl的頁面的DataContext屬性。

如果UserControl沒有設置它的DataContext,它會繼承頁面的DataContext,並且我可以很容易地將嵌入的DataForm的ItemsSource屬性綁定到它的屬性,但UserControl有它自己的DataContext。

如果UserControl被編寫爲僅用於此頁面,則可以使用RelativeSource綁定將嵌入的DataForm的ItemsSource屬性綁定到頁面的一個屬性。但是,此用戶控件旨在用於許多地方,並且不能對用戶控件之外的屬性進行無聲依賴。我需要明確依賴。

在UserControl上創建DependencyProperty是正確的方法,但不需要嘗試複製UserControl的視圖模型中的屬性。

我需要做的是

1:一個DependencyProperty添加到該用戶控件:

public QueryableCollectionView ItemsSource 
{ 
    get { return (QueryableCollectionView)GetValue(ItemsSourceProperty); } 
    set { SetValue(ItemsSourceProperty, value); } 
} 
public static readonly DependencyProperty ItemsSourceProperty = 
    DependencyProperty.Register("ItemsSource", typeof(QueryableCollectionView), typeof(FormControl)); 

注:我並不需要實現一個回調函數。

2:綁定嵌入式的DataForm的ItemsProperty到該用戶控件的這個新的DependencyProperty,使用的RelativeSource綁定:

<UserControl 
     ...> 
    <telerik:RadDataForm 
     ItemsSource="{Binding Path=ItemsSource, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" 
     /> 
</UserControl> 

3:請在頁面視圖模型可見,用適當的類型(DataContext的具有類型的對象) :

public partial class MainWindow : Window 
{ 
    public MainWIndow() 
    { 
     this.InitializeComponent(); 
     this.DataContext = new MainWindowVM(); 
    } 
    public MainWindowVM viewModel 
    { get { return this.DataContext as MainWindowVM; } } 
} 

4:在頁面上,綁定用戶控件的新ItemsProperty的DependencyProperty到頁面視圖模型的相應屬性,再次使用的RelativeSource綁定:

<Window 
     ...> 
    <local:FormControl 
     ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type telerik:RadPane}},Path=viewModel.items}" 
     /> 
</Window> 
+0

+1對於RelativeSource = {RelativeSource AncestorType = {x:Type UserControl}} – 2013-02-20 20:50:46