WPF+MVVM(Livet)でFileOpenDialogの結果を手に入れたい。

受付中

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 2,134

picko

score 50

こんにちは。いつもお世話になります。

WPF + Livet + Livet Extensionで、FileOpenDialogの結果をViewのTextBoxに反映したいです。

Window10, Visual Studio2015, WPF4.5, Livet1.3.0.0, LivetExtensions1.0.3.0)の組み合わせです。

LivetWindowのsolutionをつくり、そこにNuGetでLivetExtensionsを入れました。
codeは下記のとおりです。

Q1)buttonを押してもOnOpenFolderCommandExecutedが呼ばれないのはなぜ?
Q2)OpenFolderDialogのResultはどこにあるの?

code中にあるのは参考にしたVBのcodeです。
VB読めないので、C#で書き直せずにいます。
ご示唆ください。

<Window x:Class="LivetWPFApplication2.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
        xmlns:l="http://schemas.livet-mvvm.net/2011/wpf"
        xmlns:v="clr-namespace:LivetWPFApplication2.Views"
        xmlns:vm="clr-namespace:LivetWPFApplication2.ViewModels"
        Title="MainWindow" Height="162.527" Width="569.6">

    <Window.DataContext>
        <vm:MainWindowViewModel/>
    </Window.DataContext>

    <i:Interaction.Triggers>

        <i:EventTrigger EventName="ContentRendered">
            <l:LivetCallMethodAction MethodTarget="{Binding}" MethodName="Initialize"/>
        </i:EventTrigger>
        <i:EventTrigger EventName="Closed">
            <l:DataContextDisposeAction/>
        </i:EventTrigger>
    </i:Interaction.Triggers>

    <Grid Margin="10">
        <Grid.RowDefinitions>
            <RowDefinition Height="40"/>
            <RowDefinition Height="30"/>
            <RowDefinition Height="30"/>
        </Grid.RowDefinitions>
        <Grid Grid.Row="0" >
            <Label Content="folder full path" HorizontalAlignment="Left" FontFamily="Meiryo"/>
        </Grid>
        <Grid Grid.Row="1" >
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="30"/>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="20"/>
            </Grid.ColumnDefinitions>
            <TextBox Grid.Column="1"  Text="{Binding FilePathText, Mode=TwoWay}" x:Name="SaveFolderTextBox" TextWrapping="NoWrap" FontFamily="Meiryo" FontSize="11"/>
        </Grid>
        <Grid Grid.Row="2" >
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="75"/>
                <ColumnDefinition Width="75"/>
                <ColumnDefinition Width="75"/>
            </Grid.ColumnDefinitions>

            <Button Grid.Column="1" Content="OpenFolder">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <l:FolderBrowserDialogInteractionMessageAction>
                            <l:DirectInteractionMessage CallbackCommand="{Binding OpenFolderCommand}" CallbackMethodName="FolderSelected">
                                <l:FolderSelectionMessage Description="Select Folder" DialogPreference="None"/>
                            </l:DirectInteractionMessage>
                        </l:FolderBrowserDialogInteractionMessageAction>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Button>

            <Button Grid.Column="2" Content="Cancel" Click="CancelButtonClick"/>
            <Button Grid.Column="3" Content="OK" Click="OkButtonClick"/>
        </Grid>
    </Grid>
</Window>
using System.Windows;

namespace LivetWPFApplication2.Views
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void OkButtonClick(object sender, RoutedEventArgs e)
        {
            this.DialogResult = true;
        }

        private void CancelButtonClick(object sender, RoutedEventArgs e)
        {
            this.DialogResult = false;
        }
    }
}
using System.Windows;
using Livet;
using Livet.Commands;

namespace LivetWPFApplication2.ViewModels
{
    public class MainWindowViewModel : ViewModel
    {
        public void Initialize()
        {
            this.OpenFolderCommand = new ViewModelCommand(this.OnOpenFolderCommandExecuted, () => true);
        }

        public ViewModelCommand OpenFolderCommand { get; set; }
        public string FilePathText { get; set; }

        private void OnOpenFolderCommandExecuted()
        {
            MessageBox.Show("OnOpenFolder");
            //TODO translate to C# sample VB code http://d.hatena.ne.jp/hilapon/20111111/1320978112
            /*
            # Region "OpenCommand"
            Private _OpenCommand As ListenerCommand(Of OpeningFileSelectionMessage)
            Public ReadOnly Property OpenCommand() As ListenerCommand(Of OpeningFileSelectionMessage)
                Get
                    If _OpenCommand Is Nothing Then
                        _OpenCommand = New ListenerCommand(Of OpeningFileSelectionMessage)(AddressOf Open)
                    End If
                    Return _OpenCommand
                End Get
            End Property

            Private Sub Open(ByVal parameter As OpeningFileSelectionMessage)
                If String.IsNullOrEmpty(parameter.Response) Then Return
                MessageBox.Show("選択されたファイルは " + parameter.Response + " です。")
            End Sub
        #End Region
        */
        }
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

Livetを駆使したMVVM風アプリ作成のメモ

選択ファイルはOpeningFileSelectionMessage.FileNameです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る