【问题标题】:Enable TextBox when combobox's specific item is selected in MVVM在 MVVM 中选择组合框的特定项目时启用 TextBox
【发布时间】:2014-07-22 14:06:53
【问题描述】:

我正在使用 MVVM conceot 来开发我的项目。 我有组合框和文本框的视图,我希望仅在选择组合框的特定项目时启用文本框。组合框的项目源绑定到字符串列表,我要做的就是选择列表的第四个元素“其他”时启用文本框,否则禁用。 在视图中,我有

      <ComboBox x:Name="department_Combobox"   HorizontalAlignment="Left" 

    ItemsSource=" {Binding Path= DepartmentList}" SelectedItem="{Binding Department}"

    VerticalAlignment="Top" Width="200" Height="25" SelectedIndex="0" Grid.Row="17" 

     Grid.RowSpan="2" Grid.Column="1"  >

     </ComboBox>

     <TextBox x:Name="department_Name_TextBox"  Text="{Binding  

   Path=Department,Mode=TwoWay}"    Grid.Row="17"  TextWrapping="Wrap" Grid.Column="2"

   Width="201" Height="24" VerticalAlignment="Center" HorizontalAlignment="Right"     />

如何在仅选择 Departmentlist 的第 4 个列表时启用文本框,并在选择其他元素时禁用文本框? 谢谢。

【问题讨论】:

  • 看起来使用触发器比使用绑定更好。

标签: c# wpf mvvm combobox


【解决方案1】:

正如 King King 所说,您应该为此使用触发器。我会添加一个属性“SelectedDepartment”来绑定你的组合框 SelectedItem。否则,当您在 TextBox 中键入并更新 Department 时,它将不再满足 Trigger 的条件,并将禁用文本框。在别处更改逻辑以返回 SelectedDepartment 值,除非那是“其他”,然后使用 Department 值。

我添加了默认为 False 的 IsEnabled 和一个绑定到 SelectedDepartment 的触发器,当值为“Other”时将启用 TextBox。

<TextBox x:Name="department_Name_TextBox" 
         Text="{Binding Path=Department, Mode=TwoWay}"
         Grid.Row="17"
         TextWrapping="Wrap"
         Grid.Column="2"
         Width="201"
         Height="24"
         VerticalAlignment="Center"
         HorizontalAlignment="Right">
   <TextBox.Style>
      <Style TargetType="{x:Type TextBox}">
         <Setter Property="IsEnabled"
                 Value="False" />
         <Style.Triggers>
            <DataTrigger Binding="{Binding Path=SelectedDepartment}"
                         Value="Other">
               <Setter Property="IsEnabled"
                       Value="True" />
            </DataTrigger>
         </Style.Triggers>
      </Style>
   </TextBox.Style>
</TextBox>

编辑:要在 ComboBox 关闭“Other”时清除 TextBox 值,我将添加一个 OnSelectedDepartmentChanged 方法来处理此问题。

private string _SelectedDepartment;
public string SelectedDepartment
{
   get { return _SelectedDepartment; }
   set
   {
      if (value == _SelectedDepartment)
         return;

      _SelectedDepartment = value;
      RaisePropertyChanged("SelectedDepartment");
      OnSelectedDepartmentChanged();
   }
}

private void OnSelectedDepartmentChanged()
{
    if (!SelectedDepartment.Equals("Other"))
       Department = string.Empty;
}

【讨论】:

  • 通常我也会推荐使用触发器。一个问题:什么是可测试性?另一种解决方案是绑定您在组合框中选择的项目,并创建一个属性来检查该绑定属性并用于显示或隐藏文本框。我不知道它是否更好。
  • 非常感谢,它有效,我还有一个问题是如何在未选择“其他”时清理文本框的文本?我的意思是,当列表的其他元素被选中时,文本框如何保持为空
  • @Andre 我们有一个自动化的 UI 测试工程师,他编写编码的 UI 测试来测试这样的事情。你当然可以使用你的方法来处理这个问题,我个人不喜欢让 SelectedDepartment 为其他属性引发属性更改事件,除非我需要(通常将其用于计算属性)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多