【问题标题】:Enable text box when combobox item is selected选择组合框项目时启用文本框
【发布时间】:2012-05-17 20:48:40
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这是可以做到的;-) 向我们展示您到目前为止所拥有的一切,我们会让您走上正轨。使您的绑定尽可能依赖于您要绑定的类的属性(所谓的 Viewmodel),避免将 TextBox 绑定到 ComboBox。当 Combobox 发生 Property 更改并将 TextBox 绑定到 that 时,让 ViewModel 的状态发生变化
  • ,我只希望它在 XAML 中而不是在代码后面。我不想为每个索引值重复这一点。我已经在文本框的样式触发器中编写了这段代码
  • 我暂时过去了,没时间了。但其他人有望接管。
  • 尚不清楚您要在这里做什么。您希望在选择 any 组合框项时启用文本框吗?或者当某些特定项目被选中时?
  • 是的,我希望在选择组合框时启用文本框。或者应该始终禁用它。

标签: wpf wpf-controls


【解决方案1】:

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

类似的东西

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

【讨论】:

    【解决方案2】:

    虽然更好的方法是使用 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>
    

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

    编辑:扩展代码sn-p

    【讨论】:

    • 是的,我同意,但问题是应用程序何时运行。文本框将首先被禁用。只有当我们在组合框中进行选择时才会启用它,否则它应该保持禁用状态
    • 解决方案有效吗?我还建议在此处简单地使用 并相应地设置 Property 和 SourceName 属性。您无需使用 Binding 或 DataTrigger 来触发纯 UI 元素。
    • 触发器的哪个属性适合组合框选择。
    • @user1379584:一开始是禁用的。你试过我的例子吗?
    • 我想得到你的例子。在哪里我看不到它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多