单击按钮时隐藏弹出按钮(DelegateCommand)

dub*_*lee 0 c# xaml mvvm winrt-xaml windows-8.1

我正在构建一个Windows应用商店应用,我有一个如下所示的弹出窗口: 飞出去

Flyout工作正常,我可以添加当我点击"添加"一个新的地址Button.问题是,我希望能够隐藏它Flyout.我DelegateCommandViewModel,所以我没有参考实际的View元素.

我试过更改DelegateCommand参数,如下所示:

public DelegateCommand<object> AddAddressCommand
{
    get { return new DelegateCommand<object>(AddAddress, CanAddAddress); }
}

public void AddAddress(object parameter)
{
    if (_isEditing)
    {
        NewAddress.PayeeId = CurrentPayee.Id;
        _addressRepository.InsertAsync(NewAddress);
    }
    CurrentPayee.Addresses.Add(NewAddress);
    NewAddress = new Address();

    // TODO: hide Flyout
}
Run Code Online (Sandbox Code Playgroud)

而在我的XAML中,我试图通过一CommandParameterDelegateCommand,像这样:

<Button Content="Add" 
        Command="{Binding AddAddressCommand}"
        CommandParameter="{Binding RelativeSource={RelativeSource Self}}"
        HorizontalAlignment="Center" />
Run Code Online (Sandbox Code Playgroud)

如果我通过{RelativeSource Self},我得到了Button预期的引用,但我无法引用树上的任何其他内容."添加" Button是其中的子项Flyout,附加到"添加地址" AppBarButton.

理想情况下,我可以Flyout直接传入引用,或者AppBarButton,Flyout.Hide()当我单击"添加"按钮时,我可以调用.

我已经尝试设置x:NameAppBarButtonFlyout,并在引用他们CommandParameter像这样:

CommandParameter="{Binding ElementName=AddAddressFlyout}"
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,我的参数是null.是否可以使用直接数据绑定来实现这一点,或者我将不得不添加某种Behaviors?

小智 10

也许我在你的要求中缺少一个微妙的东西,但我能够很容易地使用x:Name和.Hide()关闭弹出窗口

<Flyout>标签中使用x:Name ="MyFlyout" ,然后通过执行MyFlyout.Hide()在C#click事件中关闭它

XAML代码:

<Page.BottomAppBar>
    <CommandBar>
        <AppBarButton Icon="Add">
            <AppBarButton.Flyout>
                <Flyout x:Name="MyFlyout">
                    <StackPanel>
                        <Button HorizontalAlignment="Right" Click="CancelButton_Click" Margin="0,-10,-10,0">
                                <SymbolIcon Symbol="Cancel"/>
                        </Button>
                            <TextBlock>Hello World</TextBlock>
                            <TextBox></TextBox>
                    </StackPanel>
                </Flyout>
            </AppBarButton.Flyout>
        </AppBarButton>
    </CommandBar>
</Page.BottomAppBar>
Run Code Online (Sandbox Code Playgroud)

C#代码

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
    }


    private void CancelButton_Click(object sender, RoutedEventArgs e)
    {
        MyFlyout.Hide();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1更有意义的是添加一个快速事件并将其隐藏,而不是添加一些类,然后为一些很小的事情添加很多样板代码。 (2认同)