0

我在网格中有一个 CheckBox 和一个 WrapPanel。WrapPanel 里面有两个 TextBox。当 CheckBox 被选中时,整个 WrapPanel 被禁用。文本框绑定到 Properties.Settings.Default 属性。TextBox 还使用 ValidationRule 来验证输入。

我想做什么:如果一个或两个 TextBox 有验证错误,我希望检查 CheckBox 以将 TextBox 的文本返回到 Settings.Default 属性的最后一个好值,从而清除错误。

我不再关心坚持一些严格的 MVVM 模型(这个窗口很小,甚至没有 ViewModel。实现我想要的最简单的方法是什么?

我认为通过向 CheckBox 的 Checked 属性添加事件处理程序,我走在了正确的道路上,但是一旦我打开窗口它就会抛出 NullReference,当事件发生时我还没有对 minBox 和 maxBox 的引用处理程序已附加,我想。

    private void AllPages_Checked(object sender, RoutedEventArgs e)
    {
        minBox.GetBindingExpression(TextBox.TextProperty).UpdateTarget();
        maxBox.GetBindingExpression(TextBox.TextProperty).UpdateTarget();
    }

;

           <CheckBox Name="AllPages" Margin ="10,0,0,0" Grid.ColumnSpan="3" Grid.Row="1" Content="All Pages"
                      IsChecked="{Binding Source={StaticResource Settings}, Path=Default.AllPages, Mode=TwoWay}"/>
            <WrapPanel Margin="10" Grid.Row="2" 
                       IsEnabled="{Binding ElementName=AllPages, Path=IsChecked, Converter={StaticResource boolConvert}, Mode=OneWay}">
                <TextBox Name="minBox" MaxWidth="30" MinWidth="30" MaxLength="3">
                    <TextBox.Text>
                        <Binding Source="{StaticResource Settings}" Path="Default.MinPage" Mode="TwoWay"
                                 UpdateSourceTrigger="PropertyChanged">
                            <Binding.ValidationRules>
                                <local:MinValidationRule/>
                            </Binding.ValidationRules>
                        </Binding>
                    </TextBox.Text>
                </TextBox>
                <Label Margin="0,0,0,0" Grid.ColumnSpan="3" Content="to"/>
                <TextBox Name="maxBox" MaxWidth="30" MinWidth="30" MaxLength="3">
                    <TextBox.Text>
                        <Binding Source="{StaticResource Settings}" Path="Default.MaxPage" Mode="TwoWay"
                                 UpdateSourceTrigger="PropertyChanged">
                            <Binding.ValidationRules>
                                <local:MaxValidationRule/>
                            </Binding.ValidationRules>
                        </Binding>
                    </TextBox.Text>
                </TextBox>
            </WrapPanel>
4

1 回答 1

0

问题解决了:

    private void AllPages_Checked(object sender, RoutedEventArgs e)
    {
        if (minBox != null) minBox.GetBindingExpression(TextBox.TextProperty).UpdateTarget();
        if (maxBox != null) maxBox.GetBindingExpression(TextBox.TextProperty).UpdateTarget();
    }
于 2013-05-26T22:26:28.447 回答