2010-03-11 51 views
1

我有一個按鈕,當我的窗口中出現驗證錯誤時,需要禁用該按鈕。這些錯誤可能發生的項目都是文本框。將按鈕datacontext設置爲多個元素

我必將我的巴頓的DataContext這樣:

DataContext="{Binding ElementName=txtEmail}" 

現在有了這個,我可以當發生在電子郵件文本框驗證錯誤設置的按鈕樣式爲禁用,但我想這樣做也時它發生在我的窗口中的其他文本框?

如何將此綁定設置爲多個文本框?

回答

3

你不能,至少不能直接。你可以使用一個MultiBinding與所有所需的文本框的輸入,但您將需要提供IMultiValueConverter以「結合」的各種文本框到一個對象(如表):

<Button> 
    <Button.DataContext> 
    <MultiBinding Converter="{StaticResource ListMaker}"> 
     <Binding ElementName="txtEmail" /> 
     <Binding ElementName="txtFirstName" /> 
     <Binding ElementName="txtLastName" /> 
    </MultiBinding> 
    </Button.DataContext> 
</Button> 

它那麼這個結果列表對象將被傳遞給你的觸發器,所以你將不能直接訪問Validation.HasError屬性:你的DataTrigger還需要引入一個轉換器,它將列表對象轉換爲布爾值,指示是否Validation.HasError被設置爲列表中的任何內容。在這一點上,你可能也只是忘了觸發和使用MultiBinding綁定的IsEnabled:

<Button> 
    <Button.IsEnabled> 
    <MultiBinding Converter="{StaticResource AllFalse}"> 
     <Binding Path="(Validation.HasError)" ElementName="txtEmail" /> 
     <Binding Path="(Validation.HasError)" ElementName="txtFirstName" /> 
     <Binding Path="(Validation.HasError)" ElementName="txtLastName" /> 
    </MultiBinding> 
    </Button.DataContext> 
</Button> 

(這裏AllFalse轉換器,如果所有的輸入都是假返回true,false,如果任何輸入是正確的。)

然而,更好的方法可能不是將Button直接綁定到其他UI元素,而是讓您的數據對象 - 您的文本框所綁定的同一對象 - 公開IsValid屬性(使用合適的更改通知),並將您的Button.IsEnabled綁定到:

<Button IsEnabled="{Binding IsValid}" /> 

這會讓您轉向一種MVVM樣式的解決方案,它有助於測試性(例如可測試性)。很容易爲IsValid屬性創建測試;爲Button.IsEnabled創建測試要困難得多)。

+0

非常感謝給我的選擇!我會爲你的最後一個選擇而努力,你能詳細闡述一下如何解決這個問題嗎? – 2010-03-11 01:21:20

+2

確切的方法將取決於您目前如何實施驗證。我們假設這是一個IDataErrorInfo方法,您可以知道哪些字段當前無效。然後,您只需創建一個只讀的IsValid屬性,如果任何字段當前無效,則返回true。並且在每個屬性設置器中,您都會爲IsValid屬性提出PropertyChanged,以便每次將數據綁定到數據對象後,WPF都會重新查詢它。 (否則WPF不會知道刷新Button.IsEnabled綁定。)這有道理嗎? – itowlson 2010-03-11 01:25:22

+0

種類...我正在使用IDataErrorInfo。但是我弄糊塗的屬性改變了一點?誰提出和誰處理?我雖然IsValid應該提高和其他處理?沒有? – 2010-03-11 01:29:06

0

對於MVVM方法,您可以嘗試從ICommand實現命令路由器。

<Button Command="{Binding Path=Commands.MyButtonCommand}" Style="{StaticResource MyButtonStyle}" ></Button> 

其中Commands屬性是ViewModel的一部分。然後您可以控制該命令實現的功能以及是否啓用該功能。測試是一件容易的事情。