2010-01-22 30 views
0

我在我的WPF應用程序中遇到了MVVM模式和命令的問題。問題不在於MVVM模式,而在於我的GUI上更多的東西。我將解釋情況:如何在此特定的WPF環境中應用MVVM和命令?

我的應用程序可以對某些文件進行操作。我有一個功能DoStuff(int limit)的課程。我的用戶的用戶界面有以下三個項目:

  • 一個ButtonDoStuffBtn開始解析。
  • A TextBoxLimitTxt填寫一個限制。
  • A CheckBoxLimitChk啓用或禁用限制。

當你將 「取消」 LimitChk,然後LimitTxt.Text = ""LimitTxt.IsEnabled = false。當你將再次「檢查」 LimitChk,然後LimitTxt.IsEnabled = false,但直到你填寫一些文本保留爲空。

我在WPF和MVVM讀命令很多教程,但我似乎無法澆我的情況下進入那個模子。我給出的例子實際上只是我用戶界面的一小部分,但我似乎無法做到這一點很好。

我一直運行到這樣的問題:

  • 我是否需要兩個CommandsLimitChk(啓用和禁用),或只是一個(切換)?
  • 如果我將int綁定到LimitTxt,如果我將其設置爲空並禁用它,會發生什麼情況?
  • DoStuffBtn被按下時,僅僅使用DoStuff(Int32.Parse(LimitTxt.Text))是乾淨的方法嗎?
  • 如果我在LimitChk上使用了兩個命令,那麼CanExecute()函數ICommand會發生什麼情況,它決定了LimitChk是否已啓用?

所以主要問題是:我所描述的情況如何適合WPF中使用命令的好模式?

在WPF,命令和MVVM我有些鏈接已經看了:


什到目前爲止,我的理解是,我必須儘可能地保持用戶界面不變。甚至像用戶界面影響UI的東西。即取消選中LimitChk禁用LimitText。儘管如此,我認爲我應該在UI相關信息和行爲之間保持區別,而這些與實際工作密切相關。

+0

lol在像我這樣的jerseyill tarded人後 – kenwarner 2010-01-22 16:54:55

回答

1

只是一些高層次的想法,留出多餘的東西,如顏色和對齊屬性,WrapPanels等

您的視圖模型具有AA幾個屬性:

public bool? LimitIsChecked { get; set; } 
public bool LimitTextIsEnabled { get; set; } //to be expanded, below 
public ICommand ParseCommand { get; private set; } // to be expanded, below 
public string LimitValue { get; set; } // further explanation, below 

你的XAML具有CheckBox和文本框定義的東西像:

<CheckBox Content="Limit Enabled" IsChecked="{Binding LimitIsChecked}" /> 
<TextBox Text="{Binding LimitValue}" IsEnabled="{Binding LimitIsEnabled}" /> 
<Button Content="Parse" Command="{Binding ParseCommand}" /> 

你要初始化ParseCommand是這樣的:

this.ParseCommand = new DelegateCommand<object>(parseFile); 

現在,讓我們認真填寫LimitTextIsEnabled屬性太:然後

public bool LimitTextIsEnabled { 
    // Explicit comparison because CheckBox.IsChecked is nullable. 
    get { return this.LimitIsChecked == true; } 
    private set { } 
} 

parseFile方法將在LimitValue屬性的值傳遞給邏輯做實際的解析。

我在此聲明LimitValue屬性爲字符串,以避免使用顯式轉換器或其他驗證代碼混淆代碼。您可以選擇以幾種不同的方式處理「LimitValue是有效的整數」驗證/轉換。

當然,我還沒有完全實現這一點,但我想概述一種模式,在這種模式下,您並未使用Commands來更新其他小部件的狀態。相反,將這些屬性綁定到ViewModel中管理的屬性。

+0

嗯有趣的解決方案。因此,如果我理解正確,UI上影響UI上其他內容的東西(即影響文本框狀態的複選框的狀態)應該通過視圖模型。我得看看DelegateCommand 是什麼。呵呵,爲什麼LimitTextIsEnabled屬性需要一個私有集合?謝謝 – 2010-01-25 10:12:09

+0

是的,你有那裏的一般想法。 LimitTextIsEnabled不需要*私人設置,但它也不需要公共設置。 :) 'DelegateCommand '從這裏來:http://msdn.microsoft.com/en-us/library/cc707894.aspx – JMD 2010-01-25 16:52:26

3

我想你會感到困惑...你不需要任何命令,你可以使用綁定。

  • 我需要兩個命令的LimitChk(啓用和禁用),或只是一個(切換)?

你什麼都不需要。只需在您的視圖模型創建LimitEnabled財產,並綁定CheckBox它(IsChecked="{Binding LimitEnabled}"

  • 如果我綁定一個int到LimitTxt,如果我讓它空和禁用它,會發生什麼?

禁用它沒有效果。如果使TextBox空,綁定操作將失敗,因爲一個空字符串不能轉換爲int(至少不是默認的轉換器)

  • 它是一個乾淨的方式只需使用解析(當ParseBtn被按下時Int32.Parse(LimitTxt.Text))?

你並不需要。只需在您的ViewModel中創建一個Limit屬性,並將其綁定到TextBox即可。您可能需要將ExceptionValidationRule添加到Binding,以便突出顯示無效輸入。

該按鈕不是必需的,當TextBox失去焦點時(如果使用默認的UpdateSourceTrigger),解析將自動完成。如果您想自定義分析的方式,您可以創建一個自定義轉換器以用於綁定。

+0

關於啓用的限制,它不僅僅是一個需要設置的屬性,但當我檢查LimitChk時UI上的一些東西需要改變。或者我應該讓屬性監聽器在LimitEnabled更改時執行此操作? 在討論int32.Parse時,選擇Parse作爲按鈕的事物可能不是一個好主意。按鈕上的解析實際上是一些其他的解析。我將用DoStuff替換它。 – 2010-01-25 10:51:23