Wpf 选择组合框项目时启用文本框

Wpf 选择组合框项目时启用文本框,wpf,wpf-controls,Wpf,Wpf Controls,我想在选择comboboxitem时启用文本框。注意:combobox项未定义,但我在combox中使用了item source来获取combo box项的列表。我想在选择combox项时更改文本框的属性 (注释粘贴到原始问题) 我只希望它在XAML中,而不是在代码隐藏中。我不想对每个索引值重复这一点–尽管更好的方法是使用MVVM模式并绑定到ViewModel中的属性(正如Dabblenl所建议的),但我认为您可以通过以下方式实现您想要的: <StackPanel>

我想在选择comboboxitem时启用文本框。注意:combobox项未定义,但我在combox中使用了item source来获取combo box项的列表。我想在选择combox项时更改文本框的属性

(注释粘贴到原始问题)


我只希望它在XAML中,而不是在代码隐藏中。我不想对每个索引值重复这一点–

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

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


编辑:扩展代码段

我认为做这类事情的最好方法是使用转换器,这样您就不必用处理这些内容的样式污染视图,并且逻辑不在视图中

像这样的

IsEnabled="{Binding ElementName=cboVersion, Path=SelectedItem, Converter={StaticResource ObjectToBoolConverter}}"
当然,您需要ObjectToBool转换器,类似这样的东西(非常简单,没有类型检查等,应该改进)

}

记住在resourcedictionary中注册转换器 e、 g



这是可以做到的;-)告诉我们你有什么thusfar,我们会让你走上正轨。使绑定尽可能依赖于要绑定到的类(所谓的Viewmodel)的属性,避免将文本框绑定到组合框。当组合框的属性发生更改时,让ViewModel的状态发生更改,并将文本框绑定到该属性,我只希望它在XAML中,而不是在代码隐藏中。我不想对每个索引值重复这一点。我现在已经在文本框i pass的样式触发器中编写了这段代码,没有时间了。但希望其他人会接手。现在还不清楚你到底想在这里做什么。是否希望在选择任何组合框项目时启用文本框?或者当选择某个特定项目时?是的,我希望在选择组合框时启用textbox。是的,我同意,但问题是应用程序何时运行。文本框将首先被禁用。只有当我们在组合框中进行选择时,它才会被启用,否则它将继续禁用解决方案工作?我还建议简单地使用一个here,并相应地设置属性和SourceName属性。您不需要使用绑定或DataTrigger来触发纯UI元素。触发器的哪个属性适合组合框选择已更改。@user1379584:首先禁用它。你试过我的例子吗?我不明白你的例子。它在哪里?我看不见
IsEnabled="{Binding ElementName=cboVersion, Path=SelectedItem, Converter={StaticResource ObjectToBoolConverter}}"
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"/>