2012-05-09 3 views
3

Я хочу включить текстовое поле, когда выбран comboboxitem. обратите внимание, что элемент combobox не определен, но я использовал источник элемента в combox, чтобы получить список элементов combo box.i, чтобы изменить свойство текстового поля, когда выбран элемент combox.Включить текстовое поле, когда выбран элемент combobox

(Комментарий приклеиваются к исходному вопросу)

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

Я хочу это в XAML только не в коде позади. Я не хочу повторять, что для каждого значения индекса -

+1

Это можно сделать ;-) Покажите нам, что у вас есть, и мы поставим вас на правильный путь. Сделайте свои привязки максимально возможными в зависимости от свойств класса, к которому вы привязываетесь (так называемая модель Viewmodel), избегайте связывания TextBox с ComboBox. Позвольте состоянию вашего ViewModel измениться, когда Combobox имеет изменение свойства и привязывает ваш TextBox к *, который * – Dabblernl

+0

<Свойство Setter =" Background "Value =" White "/>, я хочу, чтобы он был в XAML только не в коде. Я не хочу повторять это для каждого значения индекса. Я написал этот код внутри триггеров стиля текстового поля – user1379584

+0

Я прохожу сейчас, нет времени. Но другие, надеюсь, возьмут верх. – Dabblernl

ответ

7

Хотя лучше способ сделать это, чтобы использовать шаблон 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> 

Это отключит текстовое поле, если в выпадающем списке не выбран элемент.

Edit: Expanded фрагмент кода

+0

Да, я согласен, но дело в том, когда приложение запускается. сначала будет отключено текстовое поле. он будет включен только тогда, когда мы сделаем выделение в поле со списком, иначе оно останется отключенным. – user1379584

+0

Работает ли решение? Я бы также предложил просто использовать здесь с соответствующими свойствами Property и SourceName. Вам не нужно использовать привязку или DataTrigger для запуска элементов только для пользовательского интерфейса. – cunningdave

+0

Какое свойство для триггера подходит для выбора поля со списком. – user1379584

1

я думаю, что лучший способ сделать этот вид питания использует конвертеры, так что вы не должны загрязнять View со стилями, которые обрабатывают, что и логика не по мнению

что-то вроде этого

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

конечно вам нужен Coverter 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(); 
    } 

}

и не забудьте зарегистрировать конвертер в вашем ResourceDictionary например

<Converters:ObjectToBoolConverter x:Key="ObjectToBoolConverter"/> 
Смежные вопросы