2012-04-12 93 views
0

我正在使用Silverlight 4MVVM模式。將綁定源更改回查看XAML中容器的模型

我的視圖模型有兩個屬性:

  • SomeProperty
  • MyCommand

SomeProperty是一個複雜的類型,有很多子屬性。 MyCommand是一個屬性來處理從一個按鈕指揮。

我有一個子窗口(視圖)與網格作爲LayoutRoot綁定到視圖模型的SomeProperty屬性。

<Grid x:Name="LayoutRoot" DataContext="{Binding SomeProperty, Mode=TwoWay}"> 
    ... 
</Grid> 

然而,網格內我想一個按鈕的Command屬性綁定到視圖模型的MyCommand屬性:

<Button Command={Binding MyCommand} /> 

但是,這是行不通的,因爲MyCommand是視圖模型的屬性,而不是視圖模型的屬性SomeProperty屬性。 (當我點擊按鈕它不執行命令。)

Anywho,有沒有辦法在Silverlight 4中使用數據綁定,這樣我可以有一個容器UI元素明確地設置它的DataContext屬性,但然後有一個容器中的不同控件引用一個屬性,該屬性是包含控件的DataContext的同級(或父級或其他)?

我目前的解決方法是在視圖的類中定義綁定,但我寧願將它放在XAML中。

謝謝

回答

3

如果你給你的根元素(ChildWindow,UserControl,whatever)一個名字,那麼你可以使用ElementName來獲取視圖模型。

<UserControl x:Name="MyUserControl"> 
    <Grid x:Name="LayoutRoot" DataContext="{Binding SomeProperty, Mode=TwoWay}"> 
     <Button Command="{Binding MyCommand}" DataContext="{Binding DataContext, ElementName=MyUserControl}" /> 
    </Grid> 
</UserControl> 

或者,這裏是另一種做同樣事情的方法。

<UserControl x:Name="MyUserControl"> 
    <Grid x:Name="LayoutRoot" DataContext="{Binding SomeProperty, Mode=TwoWay}"> 
     <Button Command="{Binding DataContext.MyCommand, ElementName=MyUserControl}" /> 
    </Grid> 
</UserControl> 
+0

這正是我要做的,簡單,容易理解,只是一個小小的XAML。 – 2012-04-13 11:29:13

0

您嘗試添加datacontext綁定? datacontext必須指向你的視圖模型,因爲默認的數據上下文是父控件或父數據上下文,在這種情況下,你的佈局根。

this

this

我希望這幫助。 此致敬禮。

+0

是的,在我看來的構造我給你我的視圖模型到視圖的'DataContext'財產。問題在於LayoutRoot將ITS DataContext指定爲視圖模型DataContext的子屬性,並且在LayoutRoot中的Button中我想引用DataContext中的屬性。我希望這是有道理的。 – 2012-04-12 20:48:20

0

我使用BindableProxy的版本,在這個職位描述: http://weblogs.asp.net/dwahlin/archive/2009/08/20/creating-a-silverlight-datacontext-proxy-to-simplify-data-binding-in-nested-controls.aspx

你上面的網格(可能是用戶控件中。參考資料),您將創建:

<UserControl.Resources> 
    <ns:BindableProxy x:Key="BindableProxy" /> 
<UserControl.Resources> 

然後,在按鍵綁定:

<Button Command="{Binding DataSource.MyCommand, Source={StaticResource BindableProxy}}" />