2016-07-29 9 views
-2

私は現在WPFとMVVMパターンを学習していると言っていますので、私の質問はより経験豊富な開発者に自己回答するかもしれません。私が持っているものWPF + MVVMでユーザーのフィードバックを正しく与えるにはどうすればいいですか? (ログインフォーム)

は、名前のためテキストボックスとパスワードのPasswordBoxとシンプルなログインフォームです。 nameboxはモデルにバインドされていますが、passwordboxはオブジェクト全体としてコマンドに送信されます(テキストプロパティにバインドできないため)。次に、ログインコマンドを実行するボタン。今、ログインがうまくいきましたが、私の問題は、mvvmパターンを破ることなく失敗したコマンドのリターンフィードバックを送る方法です。たとえば、フィールドの境界線の色を赤に変更します。

私の最初の本能は、モデルのプロパティを持つことです。これは失敗したときに変更されます。しかし、私は自分自身で解決策をハッキングする代わりに、適切な方法を学びたいと思っています(全体の目的を破る)。

ボーナスに関する質問: - プロパティをステートメントにバインドできますか?たとえばString.isNullOrEmpty(model.name)? - このような簡単な操作のためにMVVMパターンを完全に廃止する必要があります(プロジェクトの残りの部分は引き続き使用します)> - WPFとMVVMについて学ぶには良いリソースはありますか?フォーム怒鳴るの

コード:

<Controls:MetroWindow x:Class="Interface_WPF.View.LoginWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" 
    Title="Enter" Height="140" Width="285" WindowStartupLocation="CenterScreen" WindowStyle="None" AllowsTransparency="True" ResizeMode="NoResize"> 
<StackPanel> 
    <Grid FocusManager.FocusedElement="{Binding ElementName=NameBox}"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition Width="200" /> 
     </Grid.ColumnDefinitions> 
     <Label Grid.Row="0" Grid.Column="0" Content="Name:"/> 
     <Label Grid.Row="1" Grid.Column="0" Content="Password:"/> 
     <TextBox Grid.Column="1" Grid.Row="0" Margin="3" 
       Name="NameBox" Text="{Binding Login.Name, UpdateSourceTrigger=PropertyChanged}"/> 
     <PasswordBox Grid.Column="1" Grid.Row="1" Margin="3" 
       Name="PasswordBox"/> 
    </Grid> 
    <Button Command="{Binding LoginCheck}" 
      CommandParameter="{Binding ElementName=PasswordBox}" 
      Style="{DynamicResource SquareButtonStyle}" IsDefault="True" Width="100" HorizontalAlignment="Right" Margin="0,8,7.8,8" Content="Enter"/> 
</StackPanel> 

+0

"プロパティをステートメントにバインドできますか?たとえばString.isNullOrEmpty(model.name)"?いいえ、ただし、[DataTrigger](https://msdn.microsoft.com/en-us/library/system.windows.datatrigger(v = vs.110).aspx)を記述することができます。あなたはおそらく、[パスワードのMVVMを破る](http://stackoverflow.com/a/1493330/424129)の正しい行にいるでしょう。私はおそらくviewmodelに 'String LoginError'プロパティを与え、そのプロパティが空でなければLabelの赤いテキストで表示されるようにXAMLスタイリングを与えます。 –

+1

フィードバックについては、「wpf validation」を検索してください。あなたはプロパティにバインドしていないので、おそらく 'IDataErrorInfo'を実装したいでしょう。提案するアプローチを使用することもできます。メソッドにバインドすることはできませんが、検証を使用してメソッドを呼び出し、結果に基づいて検証ステータスを設定したり、再評価されたプロパティを公開したり、依存プロパティが変更されるたびにメソッドを呼び出したりできます。尋ねられたあなたの質問は非常に幅広く、対処できる特定のプログラミング_問題を提示していません。良い答えが必要な場合は、質問を絞り込んでください。 –

+1

@PeterDunihoこの問題についての漠然な理解はあいまいな質問をもたらす。私の悪い。あなたの答えは私にアイデアをくれました。とにかくありがとうございます:) –

答えて

1

コードビハインドで任意のコードを持っていない程度MVVMにはルールがありません - あなただけのビハインドコードでビジネスロジックをしたくありません。これは、MVVMの多くの新規参入者があまり気付かず、多くの頭痛を引き起こすものです。コードボックスの中には、フィードバックのMessageBoxなどを処理したいと思うように、多くのビューロジックを配置することができます。

ここで具体的なフィードバックをしたいときは、ブール値を返すviewmodelを返し、falseを返した場合、特定のエラーデータを持つviewmodelのプロパティの内容を含むメッセージボックスを表示します。人々がこれらのことを処理したいと思う方法はいくつかあります。

MVVMは宗教ではないことを常に覚えておいてください。これは、使用するツールであり、あなたがそれを望むならどこにでも曲げることができます。ない。

+0

FWIWでは、ビューには実際には背後に多くのコードがあるべきではありません(ユーザーがその通常と必須を制御するため)。テストや再利用が難しい、まだ「ハック」です。より良い方法、インタラクティブ性のビヘイビア、アクションがあります。つまり、Prismは 'PopupWindowAction'を使用してコードやxamlのポップアップでビューを開くことができます – Tseng

関連する問題