绑定值未更改时的WPF表单验证

时间:2012-05-25 12:17:02

标签: wpf data-binding validation

问题在于:

  1. 我有一个简单的表格(文本框等)。
    • 绑定都在BindingGroup
    • 之内
    • 每个绑定都设置了UpdateSourceTrigger=Explicit
    • 某些绑定附加了验证规则,不允许空/空值(必填字段)。
  2. 我将品牌对象绑定到表单。
  3. 如果不输入任何数据,用户会点击触发BindingGroup.UpdateSources()
  4. 的保存按钮
  5. UpdateSources成功,不会触发验证错误。
  6. 我相信这是因为如果用户在UI中主动更改了该字段的值,WPF只触发每个绑定的验证规则,并且因为我最初将一个空对象绑定到表单,所以没有任何改变。这不是我想要的行为 - 我希望在调用UpdateSources时评估所有验证规则。

    有没有人知道(希望是干净的)获得我想要的行为的方式?


    这是C#和XAML代码的一个(简化的,简化的)示例:

    ToolTypeModelPanel.xaml.cs

    private void addModelButton_Click(object sender, RoutedEventArgs e)
    {
        ToolModel model = new ToolModel();
    
        // bind the model details view to the new model
        this.createModelBinding = new Binding();
        this.createModelBinding.Source = model;
        this.modelFormGrid.SetBinding(Grid.DataContextProperty, this.createModelBinding);
    }
    
    private void saveModelButton_Click(object sender, RoutedEventArgs e)
    {
        Binding modelDataContext = this.modelFormGrid.GetBindingExpression(Grid.DataContextProperty).ParentBinding;
    
        if (modelDataContext == this.modelDetailsBinding && this.modelListBox.SelectedItem != null)
        {
            // update existing tool model
            if (this.modelFormBindingGroup.UpdateSources())
            {
                // ...
            }
        }
        else if (modelDataContext == this.createModelBinding)
        {
            // create new tool model
            ToolModel modelToCreate = (ToolModel)this.createModelBinding.Source;
    
            if (this.modelFormBindingGroup.UpdateSources())
            {
                Context.ToolModel.AddObject(modelToCreate);
                Context.SaveChanges();
    
                // ...
            }
        }
    }
    

    ToolTypeModelPanel.xaml

    <GroupBox
        Grid.Row="3"
        Grid.Column="2"
        Margin="5"
        Header="{x:Static prop:Resources.HeaderModelDetails}">
        <Grid x:Name="modelFormGrid" DataContext="{Binding ElementName=modelListBox, Path=SelectedItem}">
    
            <Grid.BindingGroup>
                <BindingGroup x:Name="modelFormBindingGroup" />
            </Grid.BindingGroup>
    
            <Label Grid.Row="0" Grid.Column="0" Content="{x:Static prop:Resources.LabelModelName}" />
            <TextBox x:Name="modelNameTextBox"
                Grid.Row="0"
                Grid.Column="1">
                <TextBox.Text>
                    <Binding Path="ModelName" UpdateSourceTrigger="Explicit">
                        <Binding.ValidationRules>
                            <vr:RequiredValidationRule />
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>
            </TextBox>
    
            <Label Grid.Row="3" Grid.Column="0" Content="{x:Static prop:Resources.LabelModelParameter}" />
            <TextBox x:Name="modelParameterTextBox"
                Grid.Row="3"
                Grid.Column="1"
                Text="{Binding Path=ModelParameter, UpdateSourceTrigger=Explicit}" />
    
            <Label Grid.Row="4" Grid.Column="0" Content="{x:Static prop:Resources.LabelFactoryAssemblyName}" />
            <TextBox x:Name="modelFactoryAssemblyTextBox"
                Grid.Row="4"
                Grid.Column="1">
                <TextBox.Text>
                    <Binding Path="FactoryAssemblyName" UpdateSourceTrigger="Explicit">
                        <Binding.ValidationRules>
                            <vr:NamespaceValidationRule />
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>
            </TextBox>
    
            <Button x:Name="saveModelButton"
                Width="100"
                Margin="36,0,0,0"
                IsEnabled="False"
                Content="{x:Static prop:Resources.ButtonSaveText}"
                Click="saveModelButton_Click" />
        </Grid>
    </GroupBox>
    

2 个答案:

答案 0 :(得分:2)

我目前的解决方法是: 将新项绑定到表单后,将需要验证的表单字段设置为非空但空值,例如:

this.modelNameTextBox.Text = string.Empty;

这会导致WPF验证方案在更新源时验证此文本框的绑定。如果有人有更清洁的解决方案,请告诉我。

答案 1 :(得分:0)

为什么你将UpdateSourceTrigger设置为显式的控件?将它改为lostfocus或propertychanged。

相关问题