【发布时间】:2019-02-03 19:35:04
【问题描述】:
我有一个现有的 UWP 应用程序来管理网站和帐户的密码,但是当我大约 3 年前编写它时,我不太了解 MVVM,因此所有事件处理程序都在 View 的代码中,现在我正在尝试通过将此代码移至 ViewModel 来解决此问题并使其更符合 MVVM。
我拥有的现有功能之一是每个 ListView 项目上的弹出菜单,因此用户可以编辑/删除条目(并执行其他几个功能),但是因为我正在为 ListView ItemTemplate 数据模板定义 DataType现在将无法识别与我的 Viewmodel 中的 Click 事件处理程序的绑定。
正如你所料,我在命名空间和页面数据上下文中都定义了我的 ViewModel,如下所示:
<Page ....
xmlns:vm="using:PassPort.ViewModels"
...>
<Page.DataContext>
<vm:MainViewModel/>
</Page.DataContext>
这是我的 ListView,它是 ItemTemplate 和 DataTemplate。在 FlyOut 中的每个 MenuFlyoutItem 中,我试图告诉它在我的 ViewModel 中使用处理程序,但它无法解析 'vm' - 它显示波浪线并显示“在类型 'Account' 中找不到属性 'vm'” .
</ListView Name="lvwAccounts"
ItemsSource="{x:Bind vm.AccountsView}"
.....>
<ListView.ItemTemplate>
<DataTemplate x:DataType="model:Account">
<Grid MinHeight="36" HorizontalAlignment="Left" RightTapped="AccountsList_RightTapped">
<FlyoutBase.AttachedFlyout>
<MenuFlyout Placement="Bottom">
<MenuFlyoutItem x:Name="OpenWebsiteButton" Text="Open Website" Click="{x:Bind vm.FlyoutOpenWebsiteButton_Click}"/>
<MenuFlyoutItem x:Name="EditButton" Text="Edit Account" Click="{x:Bind vm.FlyoutEditButton_Click}"/>
<MenuFlyoutItem x:Name="AddButton" Text="Add Account" Click="{x:Bind vm. FlyoutAddButton_Click}"/>
<MenuFlyoutItem x:Name="DeleteButton" Text="Delete Account" Click="{x:Bind vm.FlyoutDeleteButton_Click}"/>
</MenuFlyout>
</FlyoutBase.AttachedFlyout>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="150"/>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="150"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="{x:Bind AccountName}" Foreground="{StaticResource Light}"
VerticalAlignment="Center" HorizontalAlignment="Stretch"/>
<TextBlock Grid.Row="0" Grid.Column="1" Text="{x:Bind Category}" Foreground="{StaticResource Light}"
VerticalAlignment="Center" HorizontalAlignment="Stretch" TextWrapping="Wrap" />
<TextBlock Grid.Row="0" Grid.Column="2" Text="{x:Bind UserID}" Foreground="{StaticResource Light}"
VerticalAlignment="Center" HorizontalAlignment="Left"/>
<TextBlock Grid.Row="0" Grid.Column="3" Text="{x:Bind Password}" Foreground="{StaticResource Light}"
VerticalAlignment="Center" HorizontalAlignment="Left" />
<TextBlock Grid.Row="0" Grid.Column="4" Text="{x:Bind PasswordHint}" Foreground="{StaticResource Light}"/>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
代码“vm”中的所有其他地方都已解决,因此似乎由于 DataType 它无法/不会解析我的 ViewModel 引用。
我也尝试过使用 'Click="{Binding vm.[event handler]"} 但没有区别 - 所以有人知道我该如何解决这个问题吗?
【问题讨论】:
-
我认为你不应该将 ViewModel 绑定到 MenuFlyout。
-
可以绑定其他Element来解决。
-
x:Bind不使用当前 DataContext 作为默认绑定源。当您编写x:Bind vm.AccountsView时,视图代码中应该有一个vm属性,该属性包含一个视图模型实例。最好不要使用x:Bind,写ItemsSource="{Binding AccountsView}"。