2012-01-13 42 views
1

我有必然類型的ObservableCollection的視圖模型的財產一個DataGrid。在DataGrid中我有幾個DataGridTextColumns綁定到ObservableCollection的項目。我需要訪問父DataContext(ViewModel)來設置其中一個DataGridTextColumns的Visibility屬性。 有一個解決方案建議在互聯網上:使用父母的DataContext的用於Visibility屬性

{Binding DataContext.IsColumnVisible, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MyControl}}} 

IsColumnVisible屬性的類型System.Windows.Visibility的。這樣的解決方案適用於其他屬性,如DataGridTextColumn.Binding,但不適用於DataGridTextColumn.Visibility! 是否有解決方案的可見性?

編輯:我終於通過了以下解決方案: Bind datagrid column visibility MVVM

回答

2

DataGrid中柱是抽象的對象,使用你不能瞄準他們ElementName(缺乏namescope)或RelativeSource(未在視覺樹)。

此外DataGrid中柱沒有DataContext ...

+0

謝謝你的解釋!但是,有沒有太複雜的方式來實現我的目標? – vkrzv 2012-01-13 17:34:18

+0

@ user835103:嗯,列沒有一個DataContext,什麼是你嘗試目標DataContext的?該項目或「DataGrid」的? – 2012-01-13 17:49:33

+0

DataGrid的。對不起,我沒有訪問我的SA帳戶。 – vkrzv 2012-01-16 10:39:21

0

您可以使用BooleanToVisibilityConverter給母公司Visibility屬性轉換爲布爾值。

http://msdn.microsoft.com/en-us/library/system.windows.controls.booleantovisibilityconverter.aspx

+0

這裏我不需要BooleanToVisibilityConverter。 ViewModel.IsColumnVisible和DataGridTextColumn.Visibility的類型都是System.Windows.Visibility的。實際上,我暫時將ViewModel.IsColumnVisible類型從bool更改爲Visibility,以簡化轉換器。 – vkrzv 2012-01-13 17:26:48

0

您綁定列的Visibility屬性爲您的視圖模型的屬性。 見the following SA question

另一件事是:使用BooleanToVisibilityConverter類。這是不好的你的視圖模型公開一個類型的屬性(Visibility),與視圖密切相關。這會在視圖和視圖模型之間引入應該避免的耦合。

。公開bool,然後讓視圖使用轉換器自身適應它的視圖模型。