我有一个问题而不是问题。 我在XAML中有listView:
<ListView Margin="25,10,25,10" Name="BookListView" ItemsSource="{Binding Books}" DockPanel.Dock="Top">
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding Name}"/>
<StackPanel>
<TextBlock Text="Number: " />
<TextBlock Text="{Binding Number}" />
</StackPanel>
<Button Content="Read" Visibility="Hidden" Name="ReadButton" Command="{Binding ReadCommand}"/>
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource Mode=TemplatedParent}}" Value="True">
<Setter TargetName="ReadButton" Property="Visibility" Value="Visible"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
对于形式我的DataContext:
public MainWindow()
{
InitializeComponent();
DataContext = new BookListViewModel();
}
我的listView itemsSource绑定到我的类的元素observableCollection,名为&#34; Book&#34;在我的viewModel中,一切正常(在此代码片段中,我删除了指定此窗口外观的所有代码)。
我的问题是我的列表中的每个元素都包含一个按钮,当单击元素时,该按钮会显示出来。如果我像在此代码中那样绑定命令,应用程序将期望我的ReadCommand在Book类代码中,正如我一直认为的那样违反了MVVM模式。
所以我的问题是 - 这个解决方案在MVVM模式中是否可以接受?如果不是,那么我如何从listView中的绑定到observableList返回到我的按钮中绑定viewModel?
答案 0 :(得分:3)
在ReadCommand
类中拥有Book
属性不会以任何方式违反MVVM。但是,在视图模型中使用ReadCommand
可能更合理,更方便。在这种情况下,您可以使用RelativeSource
来访问ListView的DataContext,它实际上是视图模型:
<Button Content="Read" Visibility="Hidden" Name="ReadButton"
Command="{Binding Path=DataContext.ReadCommand, RelativeSource={RelativeSource AncestorType=ListView}}"/>