内容对话框文本框值检索

时间:2016-01-10 22:00:25

标签: c# wpf mvvm data-binding modal-dialog

在用于显示内容对话框的MVVM应用程序中,我已经实现了ISpeechDialogService来显示内容对话框,我已将其注入主页面视图模型:

 public interface ISpeechDialogService
    {
        Task<ContentDialogResult> ShowAsync();
        string GetText();
    }

    public class SpeechDialogService : ISpeechDialogService
    {

        private Speech contentDialog;

        public async Task<ContentDialogResult> ShowAsync()
        {
            contentDialog = new Speech();
            ContentDialogResult result = await contentDialog.ShowAsync();
            return result;
        }

因此,通过按主页面上的按钮 - 显示以下内容对话框:

命令:

public ICommand DictateCommand { get; set; }

        public async void Dictate(object obj)
        {
           var result = await _dialog.ShowAsync();
            if (result == ContentDialogResult.Primary)
            { new MessageDialog(_dialog.GetText()).ShowAsync(); }
        }

内容对话框:

<ContentDialog
    x:Class="UWP1.Views.Speech"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:UWP1.Views"
    xmlns:vm="using:UWP1.ViewModels"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="Dictate"
    PrimaryButtonText="Accept"
    SecondaryButtonText="Cancel"
    PrimaryButtonClick="ContentDialog_PrimaryButtonClick"
    SecondaryButtonClick="ContentDialog_SecondaryButtonClick" VerticalAlignment="Center"
    x:Name="ContentDialog"
    >
    <ContentDialog.DataContext>
        <Binding Path="SpeechViewModel" Source="{StaticResource ViewModelLocator}" />
    </ContentDialog.DataContext>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="150" />
            <ColumnDefinition Width="150" />
        </Grid.ColumnDefinitions>
            <Button Margin="15" Content="Dictate" Grid.Row="0" Grid.Column="0" HorizontalAlignment="Stretch" Command="{Binding DicateCommand}"/>
        <Button  Margin="15" Content="Clear Text" Grid.Row="0" Grid.Column="1" HorizontalAlignment="Stretch" Command="{Binding ClearDicateCommand}"/>
        <TextBlock Grid.Row="1" Grid.ColumnSpan="2" Text="Tap 'Dictate', and speak" FontSize="12" />
            <TextBlock Margin="0 10 0 0" Grid.Row="2" Grid.ColumnSpan="2" Text="Message Dication" HorizontalAlignment="Center" FontSize="24"  />
        <ScrollViewer Grid.Row="3" Grid.ColumnSpan="2" Height="300">
            <TextBox x:Name="Input" Margin="5 5 5 10"  AcceptsReturn="True" Text="{Binding Comment}"  TextWrapping="Wrap" />
        </ScrollViewer>
    </Grid>
</ContentDialog>

我为内容对话框(包含消息框)创建了一个单独的视图模型,用于将按钮和属性的命令绑定到texbox。

所以目前我的主页面具有链接的主页面视图模型和内容对话框,并具有单独的视图模型。

我需要做的是将内容对话框文本框中的值传递给主页面视图模型属性。

你能告诉我如何实现这个目标吗?

2 个答案:

答案 0 :(得分:0)

我已经在VB中为UWP编写了代码。但我不太确定C#,但我会尝试在C#中编写它。基于我在VB中为UWP编写的内容,要从内容对话框传递值,您需要将以下代码添加到主按钮内的内容对话框中单击功能:

<强> this.Content = Input.Text

然后在mainPage,您可以使用

检索它
if (result == ContentDialogResult.Primary)
{
    new MessageDialog(_dialog.Content.toString).ShowAsync();
}

答案 1 :(得分:0)

这是一个古老的话题,但是我在这里结束了,所以这是我的不起眼的贡献。 ContentDialog的返回类型基本上是ContentDialogResult。 您可以在ContentDialog构造函数中添加一个参数,该参数是您希望用户在对话框中修改的对象。 请记住,如果使用整数,则需要ref。