dub*_*lee 0 c# xaml mvvm winrt-xaml windows-8.1
我正在构建一个Windows应用商店应用,我有一个如下所示的弹出窗口:

该Flyout工作正常,我可以添加当我点击"添加"一个新的地址Button.问题是,我希望能够隐藏它Flyout.我DelegateCommand在ViewModel,所以我没有参考实际的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中,我试图通过一CommandParameter到DelegateCommand,像这样:
<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:Name的AppBarButton和Flyout,并在引用他们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事件中关闭它
<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)
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)