在MVVM中选择组合框的特定项时启用TextBox

时间:2014-07-22 14:06:53

标签: c# wpf mvvm combobox

我正在使用MVVM conceot来开发我的项目。 我有使用组合框和文本框的视图,我希望只有在选择了组合框的特定项目时启用文本框。共同框的项目源被绑定到字符串列表,而我想要做的就是当第4个元素列表是"其他"选择启用文本框,否则禁用。 在视图中,我有     

      <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"     />

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

1 个答案:

答案 0 :(得分:0)

正如King King所说,你应该使用Trigger。我添加了一个属性&#34; SelectedDepartment&#34;绑定你的组合框SelectedItem也是。否则,当您键入TextBox并更新Department时,它将不再符合Trigger的条件并将禁用文本框。在其他地方更改逻辑以返回SelectedDepartment值,除非它是&#34;其他&#34;然后使用部门值。

我添加了IsEnabled默认为False,并且绑定到SelectedDepartment,当值为&#34;其他&#34;时将启用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关闭&#34;其他&#34;时清除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;
}