我試圖讓我的腳在地面上用WPF和MVVM了將近一年,但現在每次我想我明白它是如何工作的,或至少它是如何應該工作,出現了一些不起作用的東西,我無法理解或找出原因。也許你可以幫助我這個。WPF數據在文本菜單綁定:直接與資源
爲了簡單起見,我有一個非常基本的視圖模型:
Public Class MainViewModel
Private _testCommand As ICommand = New RelayCommand(AddressOf Me.Test)
Private _items As IEnumerable(Of String) = New String() {"Item 1", "Item 2", "Item 3"}
Public ReadOnly Property TestCommand As ICommand
Get
Return _testCommand
End Get
End Property
Private Sub Test()
MsgBox("Test")
End Sub
Public ReadOnly Property Items As IEnumerable(Of String)
Get
Return _items
End Get
End Property
End Class
我的DataContext的使用我有兩個ListView
同樣帶有基本窗口這個視圖模型。
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ContextMenuTest"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:MainViewModel />
</Window.DataContext>
<Window.Resources>
<ContextMenu x:Key="ItemContextMenu">
<MenuItem Header="Test Left" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}, Path=DataContext.TestCommand}" />
</ContextMenu>
<Style x:Key="TestItemStyle_Left" TargetType="{x:Type ListViewItem}">
<Setter Property="ContextMenu" Value="{StaticResource ItemContextMenu}" />
</Style>
<Style x:Key="TestItemStyle_Right" TargetType="{x:Type ListViewItem}">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="Test Right" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}, Path=DataContext.TestCommand}" />
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ListView Grid.Column="0" ItemsSource="{Binding Items}" ItemContainerStyle="{StaticResource TestItemStyle_Left}">
<ListView.View>
<GridView>
<GridViewColumn Header="Test" Width="100" DisplayMemberBinding="{Binding}" />
</GridView>
</ListView.View>
</ListView>
<ListView Grid.Column="1" ItemsSource="{Binding Items}" ItemContainerStyle="{StaticResource TestItemStyle_Right}">
<ListView.View>
<GridView>
<GridViewColumn Header="Test" Width="100" DisplayMemberBinding="{Binding}" />
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window>
兩個ListView
可相同,他們只在他們所使用的ItemContainerStyle
不同。 而且兩者ItemContainerStyle
唯一在ContextMenu
在工作的方式不同。在左側它的實現和使用作爲一種資源,右側則直接執行。
但爲什麼該命令的上下文菜單項的結合僅在左側,而不是右側工作?
謝謝您的解釋:-)
[*如何綁定到數據不繼承DataContext的時候*](http://www.thomaslevesque.com/2011/03/21/WPF的如何做綁定到數據時,最DataContext的 - 是 - 不繼承/) – slugster
但爲什麼在DataContext不是當它的工作左側繼承右側? – Nostromo
咦?那個評論對我沒有意義? DataContext不被繼承,因爲上下文菜單不是可視或邏輯樹的一部分。這意味着你也無法搜索祖先。這從MSDN DOCO可能幫助:https://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.datacontext(v=vs.110).aspx – slugster