2015-02-23 55 views
0

我有一個WPF MultiSelectTreeView(從這裏下載:http://unclassified.software/en/source/multiselecttreeview)。如何控制從MultiSelectTreeView ViewModel的選擇

現在我想控制,用戶選擇哪些項目。一個簡單的例子是他不應該能夠選擇不同父母的孩子節點。但是也有更多的ViewModel特定用例。

通過使用PreviewSelectionChanged事件,直接檢查條件並相應地設置Cancel-flag,很容易在Window的代碼隱藏中實現此功能。但因爲我想獲得視圖和ViewModel的分離,我正在尋找一種在我的WindowViewModel中做到這一點的方法。

當然,你也可以提取支票視圖模型和視圖調用它,但它看起來錯誤:

WindowViewModel _viewModel; 

void PreviewSelectionChanged(object sender, PreviewSelectionChangedEventArgs e) 
{ 
    e.Cancel = !this._viewModel.CanSelect(e.Item as TreeItemViewModel); 
} 

我希望任何人有一個想法。

- timnot90

+0

視圖/邏輯的分離並不意味着視圖類中沒有代碼。通過使用PreviewSelectionChanged,您不會失去ViewModel的可測試性,所以在我看來這很好。 – metacircle 2015-02-23 09:01:05

+2

通常,您的數據項應具有數據綁定到「TreeViewItem.IsSelected」屬性的「IsSelected」屬性。然後,您可以將其設置爲「true」以選擇一個項目,並將其設置爲「false」以取消選擇一個項目。 – Sheridan 2015-02-23 09:06:18

+0

@Sheridan 是的,他們有。但我不知道何時設置此屬性。如果我在代碼背後做,我也可以按照我的問題描述。 因爲它似乎是好的,我想我會的。我只是認爲在mvvm中有這樣一種奇特的方式。 感謝您的幫助。 還有一件事:我可以做些什麼來標記這個問題,回答沒有「真實」的答案? – timnot90 2015-02-23 09:49:28

回答

0

通常,當數據綁定分層集合在WPF中TreeView,自定義數據項應該有自己的類中定義的IsSelected屬性。如果他們這樣做,那麼它可以綁定到每個TreeViewItemIsSelected屬性數據:

<TreeView ItemsSource="{Binding YourCollection}" ... > 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="IsSelected" Value="{Binding IsSelected}" /> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 

當做到這一點,你可以設置該屬性來true選擇一個項目,並false取消選擇的項目。

// Select Item 
dataObject.IsSelected = true; 

// Deselect Item 
dataObject.IsSelected = false; 

您可以將處理程序添加到PropertyChanged事件的每個項目的時候IsSelected屬性更改(如果它們實現的INotifyPropertyChanged接口如預期)來檢測。

+0

我現在在數據項的ViewModel中實現了一個IsSelectedChanged事件,它的工作完美。非常感謝。 – timnot90 2015-02-23 13:17:49