2008-09-30 134 views
4

我發現WPF命令參數是一個限制。也許這是一個跡象,表明我將它們用於錯誤的目的,但在我放棄並採取不同的方式之前,我仍然試着嘗試。WPF命令和參數

我整理了一個系統executing commands asynchronously,但很難使用任何需要數據輸入的東西。我知道WPF命令的一個常見模式是通過this。但是this完全不能用於異步命令,因爲所有依賴項屬性都無法訪問。

我結束了這樣的代碼:

<Button Command="{Binding ElementName=servicePage, Path=InstallServiceCommand}"> 
    <Button.CommandParameter> 
    <MultiBinding Converter="{StaticResource InstallServiceParameterConverter}"> 
     <MultiBinding.Bindings> 
      <Binding ElementName="servicePage" Path="IsInstalled"/> 
      <Binding ElementName="localURI" Path="Text"/> 
      <Binding ElementName="meshURI" Path="Text"/> 
      <Binding ElementName="registerWithMesh" Path="IsChecked"/> 
     </MultiBinding.Bindings> 
     </MultiBinding> 
    </Button.CommandParameter> 
</Button> 

,也需要InstallServiceParametersConverter類(加上InstallServiceParameters)。

任何人都看到一個明顯的方法來改善這一點?

+0

我不明白爲什麼這是一個問題。因爲我記得使用它,所以我使用了WPF。 這也意味着您可以隨時重新使用具有不同數據源的轉換器,並且不受「this」類型限制。 你能澄清你爲什麼覺得這是錯的? – 2008-10-15 08:19:54

回答

0

你需要的東西,可以讓你請求適當的對象。也許你需要一個對象來存儲父對象可以作爲屬性公開的這些參數。

真的,你應該做的是保持命令同步,並通過拋出一個新線程或將它們傳遞給命令管理器(home roll)來異步執行它們。

+0

我不確定我會認爲這是一個改進,必須在我創建的每個命令命令中複製CanExecute和異常處理代碼。 雖然謝謝。 – nedruod 2008-09-30 05:49:50

2

讓我來指點一下我的開源項目Caliburn。你可以在here找到它。最能幫助您解決問題的功能簡要記錄here

+0

這已經有一段時間了,但我不認爲你會介意將這個擴展到僅限於鏈接的答案之外嗎? – 2015-03-18 01:10:51

1

命令用於避免UI和程序邏輯之間的緊密耦合。在這裏,你試圖解決這個問題,所以你會發現它很痛苦。您希望將您的用戶界面綁定到其他某個對象(包含此數據),然後您的命令可以直接調用該對象。 嘗試搜索MV-V-M,或查看PRISM示例。

+0

起初你的建議聽起來像是一個非常好的主意,但後來我意識到,雖然這對於同步命令是一個非常好的建議,但將共享(全局)對象傳遞給異步方法是一個壞主意,因爲它可能會改變mid-執行。 – nedruod 2008-10-23 06:04:49

1

嘗試使用類似MVVM:

創建存儲在當前的「視圖」(窗口,網頁,無論是有道理的,你的應用程序)中顯示的所有數據的類。

將您的控件綁定到該類的一個實例。

讓類暴露一些ICommand屬性,將按鈕的Command屬性綁定到數據類中相應的屬性,不需要設置命令參數,因爲所有數據都已使用正常情況轉移到對象數據綁定。

有一個ICommand派生類回調到你的對象,看看這個鏈接幾種實現:

http://dotnet.org.za/rudi/archive/2009/03/05/the-power-of-icommand.aspx

內部由命令調用的方法,包所需的所有數據,並把它送上後臺線程。