2015-06-28 2 views
1

У меня есть ComboBox и TextBox. TextBox привязывается к «default» -property в моей модели ViewModel.WPF - ComboBox SelectionChanged => Изменить привязку TextBox

Что я пытаюсь сделать, так это то, что когда я изменяю значение в ComboBox, свойство TextBox изменяется на другое свойство.

<ComboBox SelectedIndex="0" Name="ComboBox1"> 
    <ComboBoxItem> 
     Messages1 
    </ComboBoxItem> 
    <ComboBoxItem> 
     Messages2 
    </ComboBoxItem> 
</ComboBox> 

<TextBox Text="{Binding Messages1}" IsReadOnly="True" VerticalScrollBarVisibility="Visible" AcceptsReturn="True" Name="LogTextBox" /> 

Я хочу изменить привязку TextBox к Messages2. Я много пробовал, но ничего не работает.

Есть ли простое решение?

+0

Под 'ListBox' вы имеете в виду' ComboBox'? –

+0

Да, я имел в виду ComboBox ... Я не знаю, почему у меня был ListBox в моей голове ... Я изменил его – Shamshiel

ответ

1

Это было задано раньше - лучшее и самое чистое решение, но не такое общее - создает несколько текстовых полей, которые будут свернуты видимыми, кроме соответствующего. Когда вы обновляете выбранный элемент combobox, обновляйте привязки видимости текстовых полей.

+1

У меня была такая же идея, и у меня также было это так в какой-то момент, но я думал, что это будет проще как-то изменить привязку. Я буду отмечать ваш ответ как правильный, потому что это проще, чем изменение привязки. – Shamshiel

1

Предполагая, что вы реализовали INotifyPropertyChanged вы можете сделать это следующим образом:

Код позади:

 public string Message1 
     { 
      get { return (string)GetValue(Message1Property); } 
      set { SetValue(Message1Property, value); } 
     } 

     // Using a DependencyProperty as the backing store for Message1. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty Message1Property = 
      DependencyProperty.Register("Message1", typeof(string), typeof(MainWindow), new PropertyMetadata(string.Empty)); 

     public string Message2 
     { 
      get { return (string)GetValue(Message2Property); } 
      set { SetValue(Message2Property, value); } 
     } 

     // Using a DependencyProperty as the backing store for Message2. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty Message2Property = 
      DependencyProperty.Register("Message2", typeof(string), typeof(MainWindow), new PropertyMetadata(string.Empty)); 


     //an array of properties as combobox.Items 
     public DependencyProperty[] AllowedProperties 
     { 
      get 
      { 
       return new DependencyProperty[] { Message1Property, Message2Property }; 
      } 
     } 

     //selected property as combobox.selectedItem 
     DependencyProperty _chosenProperty; 
     public DependencyProperty ChosenProperty 
     { 
      get 
      { 
       return _chosenProperty; 
      } 
      set 
      { 
       _chosenProperty = value; 
       OnPropertyChanged("ChosenValue"); 
      } 
     } 

     //value of the selected property as textbox.text. 
     public string ChosenValue 
     { 
      get 
      { 
       return ChosenProperty == null ? string.Empty : (string)GetValue(ChosenProperty); 
      } 
     } 

XAML:

<ComboBox ItemsSource="{Binding AllowedProperties}" 
       SelectedItem="{Binding ChosenProperty}" 
       > 
    </ComboBox> 
    <TextBlock Text="{Binding ChosenValue}"/> 
+0

Спасибо. Он работает, но я надеялся, что это будет легче выполнить. Я сделаю это, как предложил «Бен Коэн». Я хотел избежать его решения, но это проще, чем это. – Shamshiel

+0

Я согласен, я не думаю, что для этого есть простое решение. То, что предложил «Бен Коэн», - лучший способ пойти, я в основном публикую этот ответ, чтобы показать, что есть другие альтернативы. –

Смежные вопросы