2016-07-29 32 views
-2

讓我通過說我目前在學習WPF和MVVM模式,所以我的問題可能會自我回答更有經驗的開發人員。如何在WPF + MVVM中正確提供用戶反饋? (登錄表單)

我擁有的是一個簡單的登錄表單與文本框的名稱和密碼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'屬性,並使用XAML樣式,以便當該屬性不爲空時,它將以紅色文本出現在Label中。 –

+1

有關反饋,請搜索「wpf驗證」。既然你沒有綁定到一個屬性,你可能會想實現'IDataErrorInfo'。您也可以使用您建議的方法。您無法綁定到方法,但您可以使用驗證來調用方法並根據結果設置驗證狀態,或者在依賴屬性發生更改時展示重新評估的屬性,調用某個方法。你問的問題非常廣泛,並沒有提出任何可以解決的具體編程問題。如果你想要一個好的答案,請縮小這個問題。 –

+1

@PeterDuniho對此事的模糊理解會導致模糊的問題。我的錯。順便說一下,你的回答給了我一個想法,所以謝謝你:) –

回答

1

有一個在MVVM約沒有隱藏代碼中的任何代碼沒有規則 - 你只是不想在代碼背後的商業邏輯。這是許多MVVM的新手不太瞭解的東西,它會引發許多令人頭痛的問題。您可以在代碼隱藏中放置儘可能多的查看邏輯,以便處理諸如反饋MessageBoxes之類的事情。

現在,當您想給出特定的反饋時,您通常會執行類似於讓視圖在返回一個布爾值的viewmodel,如果返回false,則顯示包含特定錯誤數據的viewmodel中屬性內容的消息框。人們喜歡處理這些事情有幾種不同的方式。

總是記得MVVM不是一種宗教,它是一種可以使用的工具,如果這就是你想要做的事情,你可以將它彎曲在適合你的地方 - 你決定什麼是太多的層或不。

+0

FWIW,一個視圖不應該有太多的代碼(用戶控制它的正常和必需的),甚至沒有查看邏輯相關。它仍然是「hackish」,很難測試和重用。有更好的方法,交互行爲和動作,即Prism使用'PopupWindowAction'來允許在代碼或xaml的彈出窗口中打開一個視圖,不帶代碼 – Tseng

相關問題