如果尚未选择项目,则将组合框边框设置为红色

问题描述 投票:0回答:1

我是 C# 和 WPF 的新手,说实话,这周才开始自学。我正在尝试制作一个下拉菜单,该菜单突出显示红色(表示此字段是必需的),直到选择一个项目。我的列表中没有任何项目本身是空的,但默认状态是空白选项。一旦选择了一项,就无法再次到达空白选项。

我尝试了很多不同的方法,并且相信我理解我需要制作一个请求验证的样式模板才能更改边框颜色。但是,我遇到了一些问题。它在运行时从未真正看到验证错误。我想我一定对如何使用验证有一个根本性的误解(基本上是我自己的验证并将其用于此触发器的语法要求)。

如果有任何方法可以在没有验证的情况下完成此任务,这对我来说可能会更容易,但我没有在网上看到任何描述这一点的内容。任何帮助将不胜感激。

我的XAML ComboBox模板样式:

 <Style x:Key="ComboBoxValidationStyle" TargetType="ComboBox">
     <Setter Property="Template">
         <Setter.Value>
             <ControlTemplate TargetType="ComboBox">
                 <Border x:Name="border" BorderBrush="Green" BorderThickness="1">
                     <ComboBox x:Name="PART_EditableTextBox"
                               ItemsSource="{TemplateBinding ItemsSource}" 
                               SelectedItem="{Binding SelectedModelNumber, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}">
                     </ComboBox>
                 </Border>
                 <ControlTemplate.Triggers>
                     <Trigger Property="Validation.HasError" Value="True">
                         <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
                         <Setter Property="BorderBrush" TargetName="border" Value="Red"/>
                         <Setter Property="BorderThickness" TargetName="border" Value="1"/>
                     </Trigger>
                     <Trigger Property="IsMouseOver" Value="True">
                         <Setter Property="BorderBrush" TargetName="border" Value="#00aed7"/>
                     </Trigger>
                 </ControlTemplate.Triggers>
             </ControlTemplate>
         </Setter.Value>
     </Setter>
 </Style>

我的 XAML 组合框代码:

           <ComboBox Grid.Row="1" FontSize="15" Grid.Column="2" Width="110" Height="27" Margin="26,0,0,0" Style="{StaticResource ComboBoxValidationStyle}" ItemsSource="{Binding ModelNumbers}" Name="comboBox1">
               <ComboBox.SelectedItem>
                   <Binding Path="Name" Mode="TwoWay" RelativeSource="{RelativeSource Mode=TemplatedParent}" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True">
                       <Binding.ValidationRules>
                           <local:SelectionValidationRule></local:SelectionValidationRule>
                       </Binding.ValidationRules>
                   </Binding>
               </ComboBox.SelectedItem>
           </ComboBox>

我的验证码:

    public class SelectionValidationRule : ValidationRule
    {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            if (value is string selectedItemString)
            {
                if (string.IsNullOrEmpty(selectedItemString))
                {
                    return new ValidationResult(false, null);
                }
            }
            else if (value == null || string.IsNullOrEmpty(value.ToString()))
            {
                return new ValidationResult(false, null);
            }
            else if (value is ComboBox comboBox)
            {
                if (comboBox.SelectedIndex == -1)
                {
                    return new ValidationResult(false, null);
                }
            }

            return new ValidationResult(true, null);
        }
    }

是的,我确实在后面的 XAML 代码中包含了 SelectionValidationRule 类!

c# wpf mvvm combobox viewmodel
1个回答
0
投票

将您的

Border
标签更改为:

            <Border x:Name="border" BorderThickness="1">
              <Border.Resources>
                <Style TargetType="Border">
                  <Setter Property="BorderBrush" Value="Green"/>
                  <Style.Triggers>
                    <DataTrigger Binding="{Binding SelectedIndex, ElementName=PART_EditableTextBox}" Value="-1">
                      <Setter Property="BorderBrush" Value="Red"/>
                    </DataTrigger>
                  </Style.Triggers>
                </Style>
              </Border.Resources>
              <ComboBox x:Name="PART_EditableTextBox"
                               ItemsSource="{TemplateBinding ItemsSource}" 
                               SelectedItem="{Binding SelectedModelNumber, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}">
              </ComboBox>
            </Border>

您可以安全地删除

ComboBox.SelectedItem
标签和 SelectionValidationRule 类。 希望这有帮助...

© www.soinside.com 2019 - 2024. All rights reserved.