5

我想在选择 comboboxitem 时启用文本框。请注意,组合框项目未定义,而是我使用组合框中的项目源来获取组合框项目列表。我想在选择组合框项目时更改文本框的属性。

(粘贴到原始问题的评论)

<DataTrigger Binding="{Binding ElementName=cmbInstrumentType,
              Path=SelectedIndex}" 
              Value="1" >
    <Setter Property="IsEnabled" Value="true" />
    <Setter Property="Background" Value="White" /> 
 </DataTrigger>

我只希望它在 XAML 中而不是在后面的代码中。我不想对每个索引值都重复这一点——

4

2 回答 2

8

尽管更好的方法是使用 MVVM 模式并绑定到 ViewModel 中的属性(如 Dabblenl 建议的那样),但我认为您可以像这样实现您想要的:

    <StackPanel>
        <ComboBox ItemsSource="{Binding Items}" Name="cmbInstrumentType"/>
        <TextBox>
            <TextBox.Style>
                <Style TargetType="TextBox">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=cmbInstrumentType, Path=SelectedItem}" Value="{x:Null}">
                            <Setter Property="IsEnabled" Value="False"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBox.Style>
        </TextBox>
    </StackPanel>

如果在组合框中未选择任何项目,这将禁用文本框。

编辑:扩展的代码片段

于 2012-05-09T13:20:49.787 回答
2

我认为做这种事情的最好方法是使用转换器,所以你不必用处理它的样式污染视图,并且逻辑不在视图中

像这样的东西

IsEnabled="{Binding ElementName=cboVersion, Path=SelectedItem, Converter={StaticResource ObjectToBoolConverter}}"

当然你需要 ObjectToBool 转换器,像这样(非常简单,没有类型检查等......并且应该改进)

public class ObjectToBoolConverter : IValueConverter {
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
     return value != null;
  }

  public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
     throw new NotImplementedException();
  }

}

并记住在您的资源字典中注册转换器,例如

<Converters:ObjectToBoolConverter x:Key="ObjectToBoolConverter"/>
于 2015-05-25T13:27:50.313 回答