7

UWP と Template 10 を使用して、MVVM パターンに従って GUI アプリを作成しています。アプリケーションの一部として、メイン ページのボタンを押してコンテンツ ダイアログを呼び出す必要があります。そのため、その目的のためにスタンドアロンの .xaml ファイルに個別の ContentDialog が作成されました。

<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: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"
    >
    <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"/>
        <Button  Margin="15" Content="Clear Text" Grid.Row="0" Grid.Column="1" HorizontalAlignment="Stretch"/>
        <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 Margin="5 5 5 10"  AcceptsReturn="True"  />
        </ScrollViewer>
    </Grid>
</ContentDialog>

ボタンを押してメインページで開く/呼び出す適切な方法は何ですか(ビューとビューモデルのロジックを分離しておく必要があるため)?

私が今それを行う方法:

メイン ページから DictateCommand を呼び出します。これにより、ContentDialog のインスタンスが作成され、表示されます。

 <AppBarButton Grid.Column="1" Icon="Microphone" IsCompact="True" HorizontalAlignment="Right" Command="{Binding DictateCommand}"/>

        public ICommand DictateCommand { get; set; }

        public async void Dictate(object obj)
        {
            var contentDialog = new Speech();
            await contentDialog.ShowAsync();
        }

私にとってはMVVMパターン違反のようです。正しい方法でそれを行うのを手伝ってもらえますか?

編集:

ダイアログ サービスを実装し、それをメイン ビュー モデルに挿入しました。しかし、私には別の障害がありました。このダイアログでは、ダイアログのテキスト ボックスの値をカプセル化する別のビュー モデルとプロパティを作成しました。ダイアログの「同意」ボタンを押すと、この値がメイン ビューに反映される必要があります。したがって、ダイアログのテキスト ボックスの値をダイアログのビュー モデルからメイン ビュー モデルに渡す必要があります。それに対処するために別の依存性注入を実行する必要がありますか?

4

2 に答える 2

6

MVVM で推奨される解決策はSpeech Dialog、ViewModel で直接インスタンスを作成せず、 createSpeechDialogServiceです。

public interface ISpeechDialogService
{
    Task ShowAsync();
}

public class SpeechDialogService : ISpeechDialogService
{
    public async Task ShowAsync()
    {
        var contentDialog = new Speech();
        await contentDialog.ShowAsync();

    }
}

ViewModelそして、このサービスをコンストラクターに挿入します

public class AbcViewModel
{
    readonly ISpeechDialogService _dialog;

    public AbcViewModel(ISpeechDialogService dialog)
    {
        _dialog = dialog;
    }

    public async void Dictate(object obj)
    {
        await _dialog.ShowAsync();
    }
}
于 2016-01-06T00:28:08.167 に答える