2017-04-04 8 views
2

誰かが私のためにこの問題を解決するのに役立つかどうか確認したいですか? XAML要素からViewModel(例:1)内の値、またはCodeBehind(例:2)からElement ...のような値へのDataBindingの利点はありますか?HostName.Text?XAML DataBinding Clarity

<TextBlock Text="{Binding HostName}" /> --- (ex:1) 
<TextBlock Name="HostName" /> --- (ex:2) 

POGO

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Text; 
using System.Threading.Task; 

namespace AppName.Models 
{ 

public class Contact 
{ 
    [Key] 
    public int Id {get; set;} 
    public string Team { get; set;} 
    public string FirstName { get; set;} 
    public string LastName { get; set;} 
    public string Phone { get; set;} 
    public string Email { get; set;} 
    public string Role { get; set;} 
    public string DisplayName => $"[LastName}, {FirstName}"; 
} 
} 
+0

私はこの質問を完全に理解しているかどうかはわかりません。 Example1は、データバインディングビューモデルプロパティがコントロールのTextプロパティにバインドされているため、人々が参照するものです。いずれかの端でプロパティが変更されると、VMバッキングプロパティが更新されます(双方向バインディングを使用し、INotifyPropertyChangedが実装されている場合)。例2は混乱します。 HostName.Textプロパティを設定することは通常、コードビハインドファイルにありますが(ビューモデルではありません)、データバインディングではありません。 ViewModelからビューモデルを作成すると、ビューモデルとビュー内の特定のテキストブロックを認識する必要があります。これはMVVMのパターンを破壊します。 –

+0

私はあなたの訂正をより良く反映するために2番目の声明を修正しました...私が理解しようとしているのは、ある方法を別の方法で選択するときでしょうか?たとえば、ex:2はTwo-Way Binding ..をサポートできますか、または例2はバインドさえ考えられていませんか?私はあなたがコントロールのTextプロパティにバインドされていないためだと思った? – ekgcorp

答えて

1

は簡単な答えは、それはあなたのアプリケーションやニーズに依存していることです。小さなアプリケーションを構築しているときに、モデルを表示するためにコードビハインドやデータバインディングを使用しても大きな違いはありません。フローを理解し、更新をいつ行うのは簡単です。しかし、アプリケーションの複雑さが増し、コードをテストする必要がある場合、コードをより保守性とテスト可能にするパターンを使い始めることになります。それがMVVMのパターンです。

コードビハインドファイルのテストコードは、ViewModelクラスのビジネスロジックをテストして期待どおりに機能することを確認するよりも難しいです。

上記の例は、テキストのみを表示し、入力を行わないTextBlockだからこそ単純です。データがビューモデルまたはUIで変更される可能性があるため、TextBoxはバインディングのより良い例です。バインディングを使用すると、表示されたテキストをプロパティで戻すことができます。そのため、どの方向からの変更でも、モデルプロパティとUIが自動的に更新されます。

<TextBox x:Name="Entry" Text="{Binding SelectedValue , Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 

のViewModel:

public class CatalogViewModel : BindableBase 
{ 
    private string selectedValue; 
    public string SelectedValue 
    { 
     get { return selectedValue; } 
     set { SetProperty<string>(ref selectedValue, value); } 
    } 
... 
} 

それに代わるものは、テキストボックスとデータ要素間の同期で物事を保つために、コードビハインドファイル内のコードがたくさんあります。背後

<TextBox x:Name="Entry2" TextChanged="Entry2_TextChanged" /> 

コード:

private string entryText; 
public string EntryText 
{ 
    get { return entryText; } 
    set 
    { 
     if (value != entryText) 
     { 
      entryText = value; 
      Entry2.Text = entryText; 
     } 
    } 
} 
private void Entry2_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    entryText = Entry2.Text; 
} 
private void Page_Loaded(object sender, RoutedEventArgs e) 
{ 
    // initialize controls 
    EntryText = "Default"; 
} 

あなたは今、ページレイアウトのいずれかの変化の多くの原因となりますへの変更であなたのビジネスロジックを結合しました。また、コードの動作をテストするのは難しいです。

ListViewsやGridViewsのように、複数の入力コントロールとより複雑なコントロールを使用すると、複雑になります。

ビューモデルを使用し、それらにデータバインドする利点に興味がある場合は、MVVMをお読みください。https://msdn.microsoft.com/en-us/magazine/dd419663.aspx

+0

すばらしい説明..うん、私はもっと複雑なものを構築しており、MVVMロジックに従いたいと思っています。私は多くのチュートリアルをオンラインで読んで多くの記事を読んできました。私は日々の進歩に伴いますます明快になり始めています。私はまだAhaの瞬間を持っていません。たとえば、今は、Modelディレクトリ内のPOGOオブジェクトで表されるすべてのデータベーステーブルを持っています。しかし、私はViewModelでそれらをどのように表現するかをはっきりと理解しているわけではありません。 – ekgcorp

+0

ありがとうございます。 POCOクラスでエンティティフレームワークを使用していますか?モデルとビューモデルがどのように相互作用するかは、MVVMの議論のテーマです。顧客のリストを編集している場合(たとえば)、そのモデルクラスをUIバインディングで公開するか、ビューモデルクラスでそれぞれをラップしますか?私は通常、ビュー・モデルを通してモード・クラスを渡します(しかし、それらを複製しません)。だから私のCustomerListViewModelはIListプロパティを持っています XAMLでListViewにバインドされている顧客。しかし、それはモデルクラスが正しくデータバインディングをサポートするためにINotifyPropertyChangedを実装する必要があることを意味します。 –

+0

元の投稿を更新して、データベーステーブルの1つに対応するPOCOクラスを追加しました。これは、Entity Frameworkを使用しているWebServiceプロジェクト内でも複製されます。私は主なプロジェクトでそれを使用しようとしましたが、現在EF6またはCore経由でSQL Serverと同期することが不可能であることが判明したとき、私はWebServiceルートに移動しなければなりませんでした。私は、現在使用されていないので、メインプロジェクトからEFコア参照を引き出すことができると思います。 – ekgcorp

関連する問題