2015-09-10 14 views
5

Chcę powiązać element ComboBox z ciągiem znaków, ale to nie działa. Mój kod znajduje się poniżej.Wiązanie elementu ComboBox do ciągu znaków

kod w widoku:

<ComboBox   
SelectedValuePath="content" 
SelectedItem="{Binding ProductName}" 
      ......      
<ComboBoxItem>1111111111</ComboBoxItem> 
<ComboBoxItem>2222222222222</ComboBoxItem> 
<ComboBoxItem>333333333333</ComboBoxItem> 
</ComboBox> 

kod w widoku modelu

private string _productName; 
public string ProductName 
{ 
    get { return _productName; } 
    set 
    { 
     if (_productName != value) 
     { 
      _productName = value; 
      RaisePropertyChangedEvent("ProductName"); 
     } 
    } 
} 
+1

Twój kod działa dobrze, nie zapomniałeś ustawić DataContext, prawda? – Usama

+0

Tak Ustawiłem DataContext. Ciąg do powiązania ciągów działa dobrze, ale to powiązanie Combobox nie działa. – YYang

Odpowiedz

2

zakładam chcesz uzyskać tekst z ComboboxItem a nie ComboBoxItem iteself.

Tak więc wiążące są nieprawidłowe informacje. To powinno działać.

<ComboBox   
SelectedValuePath="content" 
Text="{Binding ProductName}" 
      ......      
<ComboBoxItem>1111111111</ComboBoxItem> 
<ComboBoxItem>2222222222222</ComboBoxItem> 
<ComboBoxItem>333333333333</ComboBoxItem> 
</ComboBox> 
1

Wybrany element jest typu ComboBoxItem, nie przyjmuje łańcucha. Jeśli chcesz wyświetlić nazwę produktu w jakimś innym miejscu spróbować może coś takiego:

<TextBox Text="{Binding ElementName=my_ComboBox, Path=SelectedItem}"/> 
1

tylko sugestia. Już używasz wiązania dla SelectedItem, dlaczego nie ustawisz innego wiązania dla elementów używających ItemsSource? Nie musisz więc dodawać ich statycznie w widoku.

Co więcej, nie będziesz miał problemu, aby zastanowić się, czy masz do czynienia z instancjami ComboxItem lub String z opcją SelectedItem. W przypadku wiązania za pośrednictwem ItemsSource możesz mieć pewność, że SelectedItem jest ciągiem.

Oto kod:

<ComboBox   
SelectedValuePath="content" 
SelectedItem="{Binding ProductName}" 
ItemsSource="{Binding ProductNames}" 
</ComboBox> 

w widoku modelu (lub kod tyłu) można zdefiniować ProductNames:

public String[] ProductNames 
{ 
    get 
    { 
     return _productNames; 
    } 
    set 
    { 
     if (_productNames!= value) 
     { 
      _productNames = value; 
      RaisePropertyChangedEvent("ProductNames"); 
     } 
    } 
} 
String[] _productNames; 


public NameOfConstructor() 
{ 
    List<String> productNames = new List<String>(); 
    productNames.Add("A"); 
    productNames.Add("B"); 
    productNames.Add("C"); 

    ProductNames = productNames.ToArray(); 
} 

Gdyby to było możliwe, że lista nazw zmian w trakcie realizacji, Zamiast tego użyłbym ObservableCollection<string> zamiast String[].

0

To powinno być tak

  1. Załóż zaobserwowania kolekcji produktu w widoku modelu. Powiedzmy ProductCollection
  2. wiążą się z ComboBox ItemSource jak podano poniżej
<ComboBox Name="productComboBox" Width="200" Height="30" ItemsSource="{Binding ProductCollection}"> 
       <ComboBox.ItemTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding Path=ProductName}"></TextBlock> 
        </DataTemplate> 
       </ComboBox.ItemTemplate> 
      </ComboBox> 

jeśli chcesz pokazać w polu tekstowym gdzieś wykorzystanie tego

<TextBox Text="{Binding ElementName=productComboBox, Path=SelectedItem}"/> 
Powiązane problemy