2

9 列の RadGridView があります。2 番目と 9 番目を除くすべての列には、テキスト ボックスが含まれています。行の列が空の場合、保存ボタンをクリックできないように、GridView を検証する必要があります。

すべてのセルはデータ テンプレートとして定義されます。

        <t:RadGridView.Resources>
            <DataTemplate x:Key="DraggedItemTemplate">
                <StackPanel>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{x:Static p:Resources.AddStandardWindow_TextBlock_Dragging}" />
                        <TextBlock Text="{Binding CurrentDraggedItem.SpecificationName}" FontWeight="Bold" />
                    </StackPanel>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding CurrentDropPosition}" FontWeight="Bold" MinWidth="45" Foreground="Gray"/>
                        <TextBlock Text=", (" Foreground="Gray" />
                        <TextBlock Text="{Binding CurrentDraggedOverItem.SpecificationName}" Foreground="Gray" />
                        <TextBlock Text=")" Foreground="Gray" />
                    </StackPanel>
                </StackPanel>
            </DataTemplate>
        </t:RadGridView.Resources>

        <t:RadGridView.Columns>
            <t:GridViewColumn>
                <t:GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <t:RadButton Content="X" Click="OnDeleteSpecificationButtonClicked" Style="{StaticResource ButtonCustomStyleRed}" />
                    </DataTemplate>
                </t:GridViewColumn.CellTemplate>
            </t:GridViewColumn>

            <t:GridViewColumn Header="{x:Static p:Resources.AddStandardWindow_Specifications}">
                <t:GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox Style="{StaticResource OverrideDefaultTextBoxStyle}" TextChanged="OnRowTextBoxesTextChanged" Text="{Binding SpecificationName}"/>
                    </DataTemplate>
                </t:GridViewColumn.CellTemplate>
            </t:GridViewColumn>

            <t:GridViewColumn Header="{x:Static p:Resources.AddStandardWindow_Parameter}" Width="20*">
                <t:GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <t:RadComboBox x:Name="ParameterComboBox" Style="{StaticResource ComboBoxStyle}" 
                                       ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type t:RadWindow}}, Path=DataContext.Parameters}" 
                                       DisplayMemberPath="NameUnitOfMeasure" SelectionChanged="OnParameterBoxChanged">
                            <t:RadComboBox.SelectedItem>
                                <Binding Path="Parameter" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True">
                                    <Binding.ValidationRules>
                                        <validation:ProductVariantValidation ValidatesOnTargetUpdated="True" />
                                    </Binding.ValidationRules>
                                </Binding>
                            </t:RadComboBox.SelectedItem>
                        </t:RadComboBox>
                    </DataTemplate>
                </t:GridViewColumn.CellTemplate>
            </t:GridViewColumn>

            <t:GridViewColumn Header="{x:Static p:Resources.AddStandardWindow_Nominal}" Width="20*">
                <t:GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox Style="{StaticResource OverrideDefaultTextBoxStyle}" TextChanged="OnRowTextBoxesTextChanged" KeyDown="OnKeyDown" Text="{Binding Nominal, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" SourceUpdated="OnNominalOrAccuracySourceUpdated">
                        </TextBox>
                    </DataTemplate>
                </t:GridViewColumn.CellTemplate>
            </t:GridViewColumn>

            <t:GridViewColumn Header="{x:Static p:Resources.AddStandardWindow_Accuracy}" 
                              Width="10*" Background="#D8E5F0">
                <t:GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox Style="{StaticResource OverrideDefaultTextBoxStyle}" KeyDown="OnKeyDown" Text="{Binding Accuracy,
                            NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" TextChanged="OnRowTextBoxesTextChanged" SourceUpdated="OnNominalOrAccuracySourceUpdated" />
                    </DataTemplate>
                </t:GridViewColumn.CellTemplate>
            </t:GridViewColumn>


            <t:GridViewColumn Header="{x:Static p:Resources.AddStandardWindow_Precision}"
                                  Width="10*"
                                  Background="#D8E5F0">
                <t:GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox KeyDown="OnKeyDown" Text="{Binding Presition, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" 
                                 TextChanged="OnRowTextBoxesTextChanged" Style="{StaticResource OverrideDefaultTextBoxStyle}">
                        </TextBox>
                    </DataTemplate>
                </t:GridViewColumn.CellTemplate>
            </t:GridViewColumn>

            <t:GridViewColumn Header="{x:Static p:Resources.AddStandardWindow_Min}" Width="10*">
                <t:GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox Style="{StaticResource OverrideDefaultTextBoxStyle}" 
                                 TextChanged="OnRowTextBoxesTextChanged" KeyDown="OnKeyDown" Text="{Binding Minimum, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" SourceUpdated="OnMinOrMaxSourceUpdated">
                        </TextBox>
                    </DataTemplate>
                </t:GridViewColumn.CellTemplate>
            </t:GridViewColumn>
            <t:GridViewColumn Header="{x:Static p:Resources.AddStandardWindow_Max}" Width="10*">
                <t:GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox Style="{StaticResource OverrideDefaultTextBoxStyle}" TextChanged="OnRowTextBoxesTextChanged" KeyDown="OnKeyDown" 
                                 Text="{Binding Maximum, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" SourceUpdated="OnMinOrMaxSourceUpdated">
                        </TextBox>
                    </DataTemplate>
                </t:GridViewColumn.CellTemplate>
            </t:GridViewColumn>
            <t:GridViewColumn Width="40">
                <t:GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Image Source="/Images/UpDown.png" Height="34" Width="34" Stretch="None"/>
                    </DataTemplate>
                </t:GridViewColumn.CellTemplate>
            </t:GridViewColumn>
        </t:RadGridView.Columns>
    </t:RadGridView>

検証にエラーがある場合に保存ボタンが無効になるように、コントロールの 1 つに検証ルールを適用しようとしました。ボタンのスタイルは次のとおりです。

<t:RadButton x:Name="SaveBtn" Height="30" Width="150" Content="{x:Static p:Resources.AddStandardWindow_Btn_Save}" Command="{Binding SaveStandardCommand}">
                <t:RadButton.Style>
                    <Style TargetType="{x:Type t:RadButton}" BasedOn="{StaticResource ButtonCustomStyleBlue}">
                        <Setter Property="IsEnabled" Value="false" />
                        <Style.Triggers>
                            <!-- Require the controls to be valid in order to press OK -->
                            <MultiDataTrigger>
                                <MultiDataTrigger.Conditions>
                                    <Condition Binding="{Binding ElementName=StandardTitleTextBox, Path=(Validation.HasError)}" Value="false"/>
                                    <Condition Binding="{Binding ElementName=StandardSubtitleTextBox, Path=(Validation.HasError)}" Value="false"/>
                                </MultiDataTrigger.Conditions>
                                <Setter Property="IsEnabled" Value="true" />
                            </MultiDataTrigger>
                        </Style.Triggers>
                    </Style>
                </t:RadButton.Style>
            </t:RadButton>

ここで、StandardTitle と StandardSubtitle は GridView の外にありますが、GridView セル テンプレートで定義された要素名で新しい条件を追加すると、そのコントロールが表示されないため、ValidationRule が機能しません。

今のところ、コード ビハインドで目標を達成しようとしています。

protected void OnKeyDown(object sender, KeyEventArgs e) { e.Handled = !IsNumberKey(e.Key) && !IsActionKey(e.Key); }

    private bool IsNumberKey(Key inKey)
    {
        if (inKey < Key.D0 || inKey > Key.D9)
        {
            if (inKey == Key.OemPeriod) return true;
            if (inKey < Key.NumPad0 || inKey > Key.NumPad9)
            {
                return false;
            }
        }
        return true;
    }

    private bool IsActionKey(Key inKey)
    {
        return inKey == Key.Delete || inKey == Key.Back || inKey == Key.Tab || inKey == Key.Return || Keyboard.Modifiers.HasFlag(ModifierKeys.Alt);
    }

    private void OnRowTextBoxesTextChanged(object sender, TextChangedEventArgs e)
    {
        var textbox = sender as TextBox;
        if (null == textbox) return;

        var gridView = textbox.ParentOfType<GridViewRow>().ParentOfType<RadGridView>();

        ValidateGridView(gridView);
    }

    void ValidateGridView(RadGridView gridView)
    {
        var textboxes = gridView.ChildrenOfType<TextBox>();
        var comboboxes = gridView.ChildrenOfType<RadComboBox>();

        if (null != textboxes && null != comboboxes)
            SaveBtn.IsEnabled = textboxes.All(p => p.Text.Length != 0) && comboboxes.All(p => null != p.SelectedItem);
    }

    private void OnParameterBoxChanged(object sender, SelectionChangedEventArgs e)
    {
        var combobox = sender as RadComboBox;
        if (null == combobox) return;

        var row = combobox.ParentOfType<GridViewRow>();
        var boxes = row.ChildrenOfType<TextBox>();

        foreach (var textBox in boxes)
            SaveBtn.IsEnabled = textBox.Text.Length != 0;
    }

    private void OnAddSpecificationClick(object sender, RoutedEventArgs e)
    {
        var button = sender as RadButton;
        if (null == button) return;

        var gridView = button.ParentOfType<RadWindow>().FindChildByType<RadGridView>();
        gridView.RowLoaded += OnGridViewRowLoaded;
    }

    void OnGridViewRowLoaded(object sender, RowLoadedEventArgs e)
    {
        var a = e.Row.ParentOfType<RadGridView>();
        ValidateGridView(a);
    }

しかし、新しい行を追加すると、ボタンがまだ有効になっており、他にも多くのバグがあります。

私の問題に対する通常の回避策はありますか? ありがとうございました!

4

0 に答える 0