2009-12-01 86 views
2

在我的SilverLight應用程序中,我在ViewModel中有一個名爲'vmProperty'的屬性和一個名爲'dgSource'的列表。SilverLight - 將MVVM綁定viewmodel屬性到datagrid列

我將dgSource綁定到DataGrid作爲ItemsSource,每個DataGrid行的datacontext都更改爲dgSource中的每個項目。其中一列,比如複選框列,需要綁定到vmProperty。但由於ViewModel不再是行的datacontext,我無法訪問此屬性。

我該如何解決這個問題?如果問題不明確,請讓我知道,我會發布樣本。提前致謝。

+0

是否真的打算每個行的每個複選框實例綁定回父對象上的相同屬性,似乎對我沒有多大意義? – AnthonyWJones 2009-12-01 12:11:33

回答

0

假設你的視圖模型被指定爲LayoutRoot的DataContext的這應該工作: -

​​

當然,這是不行的,最終的模板被複制,因此「LayoutRoot」在實際使用綁定的名稱範例中不存在。

最簡單的解決方案,因爲這是一個ViewModel就是改變模型。在dgSource中可用的對象上公開所需的值,或公開導航回ViewModel的Parent屬性。

+0

感謝您的回覆。我使用了你提到的ElementName方法。但我遇到了與'http://stackoverflow.com/questions/1089650/silverlight-datagrid-celltemplate-binding-to-viewmodel'相同的問題。我把這個放在datagrid外面,這段代碼很好用。但在數據網格中它沒有。 無論如何,我使用該線程提供的鏈接'http://blogs.msdn.com/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx ',但這似乎只與WPF有關。 我無法訪問AddOwner或OverrideMetadata。思考? – etrast81 2009-12-01 18:10:00

+0

感謝安東尼, 管理暴露它作爲dgSource的一部分。因爲它是複製,所以不滿意。但它正在工作。所以... :) – etrast81 2009-12-02 10:52:15

+0

這就是__view__模型的優點。如果它僅僅是__model__,但是視圖模型的重點在於它支持特定視圖或任務的數據的大量形式,那將是最令人不滿意的。 – AnthonyWJones 2009-12-02 11:00:14

0

試圖將chechbox列的檢查屬性設置爲:

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type YourViewClassName}}, Path=DataContext.vmProperty} 

這意味着該類型視圖類型將被發現,父元素,比vmProperty的是DataContext的將被檢索的價值。

更新:

這是WPF的解決方案。

爲Silverlight我想你可以嘗試使用建築像這樣:

{Binding Path=DataContext.vmProperty, ElementName=YourElement} 

凡YourElement的DataContext的是你的視圖模型的實例。例如,我認爲它可以是一個網格。

<Grid x:Name="YourElement" DataContext={Binding}> 
<!-- DataGrid here --> 
</Grid> 
+0

我認爲這是WPF,不是嗎?我相信SilverLight沒有RelativeSource或AncestorType。 – etrast81 2009-12-01 12:00:17

+0

它有RelativeSource,但只限於非常有限的容量 – AnthonyWJones 2009-12-01 12:25:02

+0

對不起,它是WPF。 – bniwredyc 2009-12-01 12:29:33