2013-04-16 70 views
2

我已經遍歷整個互聯網,每個論壇,每個博客,隨時隨地。我現在從字面上包含互聯網......除了這最後一件事情;-)。這裏的問題:我有了這樣定義的列一個WPF的DataGrid:WPF - XAML中的參考XAML元素

<tk:DataGridTemplateColumn Header="First name" Width="100" x:Name="colFirstName"> 
         <tk:DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <TextBox x:Name="tbFirstName" Validation.ErrorTemplate="{DynamicResource errorTemplateYourDetailsGrid}"> 
            <TextBox.Text> 
             <Binding Path="Firstname" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True"> 
              <Binding.ValidationRules> 
               <val:RequiredValidationRule ErrorMessage="Invalid or missing first name" ValidatesOnTargetUpdated="True"></val:RequiredValidationRule> 
              </Binding.ValidationRules> 
             </Binding> 
            </TextBox.Text> 
           </TextBox> 
          </DataTemplate> 
         </tk:DataGridTemplateColumn.CellTemplate> 
        </tk:DataGridTemplateColumn> 

正如你可以看到我已經定義了一個叫做errorTemplateYourDetailsGrid一個驗證模板。

頁有繼續按鈕,我想禁用,直到該網格中的所有字段都有效:

<Button x:Name="btnNext" HorizontalAlignment="Right" DockPanel.Dock="Right" Content="Continue" Command="{Binding YourDetailsNextCommand}" > 
        <Button.Style> 
         <Style TargetType="Button" BasedOn="{StaticResource BtnContinue}"> 
          <Setter Property="IsEnabled" Value="false" /> 
          <Style.Triggers> 
           <MultiDataTrigger> 
            <MultiDataTrigger.Conditions> 
             <Condition Binding="{Binding ElementName=tbFirstName, Path=(Validation.HasError)}" Value="false" /> 
             <Condition Binding="{Binding ElementName=tbSurname, Path=(Validation.HasError)}" Value="false" /> 
             ...etc 
            </MultiDataTrigger.Conditions> 
            <Setter Property="IsEnabled" Value="true" /> 
           </MultiDataTrigger> 
          </Style.Triggers> 
         </Style> 
        </Button.Style> 
       </Button> 

一位同事得到了這樣的事情做工精細用直基於表單的佈局(不使用數據網格)。所以我猜我需要一些語法來引用DataGrid中列中的單元格中的TextBox,以便觸發器觸發。簡單地使用ElementName不起作用。即使在您將文本輸入到這些字段時驗證模板按預期消失,該按鈕仍會保持禁用狀態。

我使用MVVM,所以任何基於代碼的解決方案都不是一個選項。

回答

0

執行驗證的MVVM方式使用INotifyDataErrorInfo(或IDataErrorInfo,如果您使用的是.NET 4.0或更低版本),所以您不會在您的XAML中定義驗證邏輯,而是在您的模型和視圖模型類中定義驗證邏輯。

一旦你實現它,你將有一箇中心位置來查詢錯誤,你可以將你的按鈕的觸發器綁定到你的視圖模型的屬性INotifyDataErrorInfo.HasErrors屬性。