所以有人建議使用WPF TreeView
,我想:「是的,這似乎是正確的方法。」現在,幾小時後,我簡直無法相信使用這種控制是多麼困難。通過一系列研究,我能夠使TreeView`控件正常工作,但我無法找到將所選項目傳遞給視圖模型的「正確」方法。我不需要從代碼中設置選定的項目;我只需要我的視圖模型就可以知道用戶選擇了哪個項目。得到選擇使用MVVM的TreeViewItem
到目前爲止,我有這個XAML,它本身並不是很直觀。這是所有的UserControl.Resources標籤內:
<CollectionViewSource x:Key="cvs" Source="{Binding ApplicationServers}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="DeploymentEnvironment"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
<!-- Our leaf nodes (server names) -->
<DataTemplate x:Key="serverTemplate">
<TextBlock Text="{Binding Path=Name}"/>
</DataTemplate>
<!-- Note: The Items path refers to the items in the CollectionViewSource group (our servers).
The Name path refers to the group name. -->
<HierarchicalDataTemplate x:Key="categoryTemplate"
ItemsSource="{Binding Path=Items}"
ItemTemplate="{StaticResource serverTemplate}">
<TextBlock Text="{Binding Path=Name}" FontWeight="Bold"/>
</HierarchicalDataTemplate>
而這裏的樹視圖:
<TreeView DockPanel.Dock="Bottom" ItemsSource="{Binding Source={StaticResource cvs}, Path=Groups}"
ItemTemplate="{StaticResource categoryTemplate}">
<Style TargetType="TreeViewItem">
<Setter Property="IsSelected" Value="{Binding Path=IsSelected}"/>
</Style>
</TreeView>
這正確的環境(開發,QA,PROD)顯示服務器。不過,我已經找到了各種方法來獲得選定的項目,許多方法是複雜和困難的。是否有簡單的方式將選定的項目獲取到我的視圖模型?
注意:TreeView`上有一個SelectedItem
屬性,但它是隻讀的。對我來說令人沮喪的是,只讀是好的;我不想通過代碼來改變它。但是我不能使用它,因爲編譯器抱怨它是隻讀的。
還有一個看似優雅的建議,做這樣的事情:
<ContentPresenter Content="{Binding ElementName=treeView1, Path=SelectedItem}" />
我問這個問題:「您的視圖模型如何能得到這個信息,我拿到ContentPresenter
持有所選擇的項目,但是我們如何將這一點轉移到視圖模型?「但目前還沒有答案。
因此,我的整體問題是:「是否有簡單的方法將選定的項目獲取到我的視圖模型?」
但是視圖模型沒有綁定到IsSelected?它是如何獲得價值的? – 2012-02-04 18:19:29
而我的意思是所選項目的價值。我不想看看是否選擇了某些東西,我想知道所選項目的價值。 – 2012-02-04 18:28:20
所以,我只注意到你寫了這個:「(樹中每個項目的視圖模型)」。我沒有樹中每個項目的視圖模型。樹中的每個項目都是* one *視圖模型中* one *列表中的項目。 – 2012-02-04 18:32:02