2

这是问题所在:

  1. 我有一个简单的表格(文本框等)。
    • 绑定都在一个BindingGroup.
    • 每个绑定都有UpdateSourceTrigger=Explicit设置。
    • 某些绑定附加了不允许空白/空值(必填字段)的验证规则。
  2. 我将一个全新对象绑定到表单。
  3. 不输入任何数据,用户点击保存按钮触发BindingGroup.UpdateSources()
  4. UpdateSources 成功,不会触发验证错误。

我相信这是因为 WPF 仅在用户主动更改 UI 中该字段的值时才会触发每个绑定的验证规则,并且由于我最初将空对象绑定到表单,因此没有任何更改。这不是我想要的行为 - 我希望在调用 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();

            // ...
        }
    }
}

工具类型模型面板.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>
4

2 回答 2

2

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

this.modelNameTextBox.Text = string.Empty;

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

于 2012-05-29T13:29:29.383 回答
0

为什么您将 UpdateSourceTrigger 设置为显式控件?将其更改为 lostfocus 或 propertychanged。

于 2012-05-25T13:05:08.750 回答