2013-10-11 2 views
0

Я пытаюсь связать текстовое поле с переменной String одновременно. Я хочу привязать ComboBox к списку.Связать два элемента управления с двумя источниками одновременно

<Window 
     x:Class="Assignment2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:validators="clr-namespace:Assignment2" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" 
     DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
    <Grid> 
     <ComboBox Height="23" HorizontalAlignment="Left" Margin="109,103,0,0" Name="StringComboBox" VerticalAlignment="Top" Width="120" SelectionChanged="SelectionChanged"> 
      <ComboBox.ItemsSource> 
       <Binding Path="ListString" Mode="TwoWay" UpdateSourceTrigger="LostFocus"></Binding> 
      </ComboBox.ItemsSource> 
     </ComboBox> 
     <TextBox Height="23" HorizontalAlignment="Right" Margin="0,51,250,0" Name="inputTextBox" VerticalAlignment="Top" Width="154" LostFocus="inputTextBox_LostFocus"> 
      <TextBox.Text> 
      <Binding Path="Name1" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"> 
       <Binding.ValidationRules> 
        <validators:RequiredFieldValidator ErrorMessage="This field Should not be empty"></validators:RequiredFieldValidator> 
        <validators:OnlyCharacterValidation ErrorMessage="Only characters allowed"></validators:OnlyCharacterValidation> 
       </Binding.ValidationRules> 
      </Binding> 
      </TextBox.Text> 
     </TextBox> 
    </Grid> 
</Window> 

Код Позади:

public partial class MainWindow : Window, INotifyPropertyChanged 
    { 
     string _name = "Default Value"; 
     public ObservableCollection<string> ListString; 
     public string Name1 
     { 
      get { return _name; } 
      set 
      { 
       _name = value; 
      } 
     } 
     public MainWindow() 
     { 
      ListString = new ObservableCollection<string>(); 
      ListString.Add("AAA"); 
      ListString.Add("BBB"); 
      ListString.Add("CCC"); 
      ListString.Add("DDD"); 

      InitializeComponent(); 
     } 
     public event PropertyChangedEventHandler PropertyChanged; 
     protected virtual void OnPropertyChanged(string propertyName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 

     private void inputTextBox_LostFocus(object sender, RoutedEventArgs e) 
     { 
      OnPropertyChanged("Name1"); 
     } 

    } 
} 

я не могу связать COMBOBOX и Textbox одновременно. Я пробовал много решений. но в любом случае только одна из этих работ. Есть ли простое решение?

ответ

0
public string Name1 
    { 
     get { return _name; } 
     set 
     { 
      _name = value; 
     } 
    } 

Забыл OnPropertyChanged("Name1");?

также:

public ObservableCollection<string> ListString; 

Ваш ListString должно быть собственности, а не только поле:

public ObservableCollection<string> ListString { get; set; } 

Наконец, я не вижу причин для этого:

private void inputTextBox_LostFocus(object sender, RoutedEventArgs e) 
{ 
    OnPropertyChanged("Name1"); 
} 
1

Ваша недвижимость должна позвонить обработчику OnPropertyChanged следующим образом:

public string Name1 
{ 
    get { return _name; } 
    set 
    { 
     _name = value; 
     OnPropertyChanged("Name1"); 
    } 
} 

private ObservableCollection<string> listString = new ObservableCollection<string>(); 

public ObservableCollection<string> ListString 
{ 
    get { return listString ; } 
    set 
    { 
     listString = value; 
     OnPropertyChanged("ListString"); 
    } 
} 

Пожалуйста, внимательно ознакомьтесь с примером на странице INotifyPropertyChanged Interface на MSDN.

1

Попробуйте изменить это.

public string Name1 
{ 
    get { return _name; } 
    set 
    { 
     _name = value; 
     OnPropertyChanged("Name1"); 
    } 
} 
Смежные вопросы