2017-04-04 97 views
2

想看看有人能幫我解決這個問題嗎?從XAML元素到ViewModel(例如:1)中的值,或者從CodeBehind(例如:2)返回到像Element ... HostName.Text這樣的元素,DataBinding是否有優勢?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支持雙向綁定..或者是例2甚至沒有考慮綁定?我以爲這是因爲你沒有綁定到控件的Text屬性? – ekgcorp

回答

1

簡單的答案是,這取決於你的應用和需求。當您構建一個小應用程序時,使用後面的代碼或數據綁定來查看模型並沒有太大區別。很容易理解流程以及何時進行更新。但是,隨着應用程序複雜程度的提高以及測試代碼的需要,您將開始使用能夠讓代碼更易於維護和可測試的模式。這就是MVVM模式的來源。

在您的代碼隱藏文件中測試代碼比僅在您的ViewModel類中測試業務邏輯並確保其按預期工作更困難。

上面的例子是一種簡單化,因爲它是一個TextBlock,它只顯示文本並且不需要輸入。 TextBox是一個更好的綁定示例,因爲數據可以在視圖模型或用戶界面中更改。通過綁定,您可以使用屬性將顯示的文本返回,以便從任何方向進行更改都會自動更新模型屬性和UI。

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

視圖模型:

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邏輯。我在網上瀏覽了許多教程並閱讀了許多文章,隨着時間的推移,我開始越來越清晰。我還沒有一個阿哈的時刻。例如,現在我已將所有的數據庫表格都放在Model目錄中的POGO對象中。但我並不總是清楚地瞭解如何在ViewModel中表示它們。 – ekgcorp

+0

謝謝。你是否在使用POCO類的實體框架?模型和視圖模型如何相互作用是MVVM中討論的話題。如果您正在編輯客戶列表(例如),您是否在UI綁定中公開該模型類,或者將每個模型類包裝在視圖模型類中?我通常通過視圖模型傳遞模式類(但不要複製它們)。所以我的CustomerListViewModel有一個屬性IList 綁定到XAML中的ListView的客戶。但這意味着你的模型類需要實現INotifyPropertyChanged以正確支持數據綁定。 –

+0

我更新了原始文章,以包含與其中一個數據庫表相對應的POCO類。這在使用實體框架的WebService項目中也是重複的。我試圖在我的主要項目中使用它,但是當我發現目前不可能通過EF6或Core與SQL Server同步時,我必須轉到WebService路由。我想我可以從主項目中取出EF核心參考,因爲它現在沒有被使用。 – ekgcorp