UWP中的绑定命令

时间:2017-05-10 18:44:38

标签: c# uwp

我的App.xaml中有一个MenuFlyout:

<Application.Resources>
    <MenuFlyout x:Key="LessonFlyout">
        <MenuFlyoutItem Text="Edit"/>
        <MenuFlyoutItem Text="Delete"/>
    </MenuFlyout>
</Application.Resources>

我想给MenuFlyoutItem点击事件,但编译器说我不能这样做。但我需要一个click事件,所以我搜索并发现我可以将命令绑定到MenuFlyoutItem。

我的MenuFlyout将附加到不同页面中的不同对象。例如:

    StackPanel thisSender = sender as StackPanel;
    FlyoutBase.SetAttachedFlyout(thisSender, Application.Current.Resources["LessonFlyout"] as MenuFlyout);
    FlyoutBase.ShowAttachedFlyout(thisSender);

所以当我点击MenuFlyoutItem时我需要调用我的函数。那我该怎么做呢?

同样快速的问题,在关于MenuFlyout的官方微软页面中,有人说MenuFlyoutItem有一个Icon属性,但在我的情况下,我没有它,VS说它有一个错误。

The member "Icon" is not recognized or is not accessible.   
The property 'Icon' was not found in type 'MenuFlyoutItem'. 

1 个答案:

答案 0 :(得分:3)

对于不同网页中的不同对象,MenuFlyoutItem及其Command会有所不同,因此通常我们不会将MenuFlyout放入Application.Resources。但是,如果您可以确保不同MenuFlyoutItem中使用的Page相同,那么以下内容可能是您的解决方案。

首先,在 App.xaml 中,为Binding设置Command

<Application.Resources>
    <MenuFlyout x:Key="LessonFlyout">
        <MenuFlyoutItem Text="Edit" Command="{Binding EditCommand}" />
        <MenuFlyoutItem Text="Delete" Command="{Binding DeleteCommand}" />
    </MenuFlyout>
</Application.Resources>

然后像官方样本中的I​Command Interface一样实施RelayCommand.cs

在此之后,我们需要在视图模型中实现EditCommandDeleteCommand,以便绑定可以正常工作。例如:

public class ViewModel
{
    public ICommand EditCommand { get; set; }

    public ICommand DeleteCommand { get; set; }

    public ViewModel()
    {
        EditCommand = new RelayCommand(() =>
        {
            //TODO
            System.Diagnostics.Debug.WriteLine("EditCommand");
        });
        DeleteCommand = new RelayCommand(() =>
        {
            //TODO
            System.Diagnostics.Debug.WriteLine("DeleteCommand");
        });
    }
}

然后附上MenuFlyout,如:

StackPanel thisSender = sender as StackPanel;
thisSender.DataContext = new ViewModel();
FlyoutBase.SetAttachedFlyout(thisSender, Application.Current.Resources["LessonFlyout"] as MenuFlyout);
FlyoutBase.ShowAttachedFlyout(thisSender);

此处使用的ViewModel仅作为示例,通常您应该拥有网页的视图模型,如果是这样,则在附加DataContext时无需设置MenuFlyout。在页面的视图模型中设置EditCommandDeleteCommand应该足够了。

出现以下错误:

  

会员&#34; Icon&#34;无法识别或无法访问   物业&#39; Icon&#39;在类型&#39; MenuFlyoutItem&#39;中找不到。

这是因为您的项目的目标是 Build 15063 之前的版本。在Icon属性中,我们可以找到其他功能和要求,表明此属性是在 Windows 10 Creators Update(v10.0.15063.0)中引入的。因此,要使用此属性,请确保您的目标是Build 15063或更高版本。