2013-05-21 2 views
0

Я пытаюсь работать с wpf с некоторыми трудностями. Этот ComboBox кажется очень простой проблемой, но я не могу его заполнить даже после прочтения всех возможных похожих сообщений.wpf combobox binding пуст

Дополнительные трудности, я думаю, что ComboBox определяется в ресурсе, здесь код ресурса:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:s="clr-namespace:DiagramDesigner"> 

<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="Styles/Shared.xaml"/> 
    <ResourceDictionary Source="Styles/ToolBar.xaml"/> 
</ResourceDictionary.MergedDictionaries> 

<ToolBar x:Key="MyToolbar" Height="120"> 

    <!--Languages--> 
    <GroupBox Header="Localization" Style="{StaticResource ToolbarGroup}" Margin="3"> 
     <Grid> 
      <ComboBox Height="23" HorizontalAlignment="Center" 
         VerticalAlignment="Top" Width="120" 
         ItemsSource="{Binding _langListString}" 
         DisplayMemberPath="ValueString" 
         SelectedValuePath="ValueString" 
         SelectedValue="{Binding LangString}" 
         /> 
     </Grid> 
    </GroupBox> 

    </ToolBar> 

Мой объект данных определяется следующим образом:

public partial class Window1 : Window 
{ 

    List<ComboBoxItemString> _langListString = new List<ComboBoxItemString>(); 

    // Object to bind the combobox selections to. 
    private ViewModelString _viewModelString = new ViewModelString(); 


    public Window1() 
    { 
     // Localization settings 
     _langListString.Add(new ComboBoxItemString()); _langListString[0].ValueString = "en-GB"; 
     _langListString.Add(new ComboBoxItemString()); _langListString[1].ValueString = "fr-FR"; 
     _langListString.Add(new ComboBoxItemString()); _langListString[2].ValueString = "en-US"; 


     // Set the data context for this window. 
     DataContext = _viewModelString; 


     InitializeComponent(); 


    } 

И моделирование:

/// This class provides us with an object to fill a ComboBox with 
/// that can be bound to string fields in the binding object. 
public class ComboBoxItemString 
{ 
    public string ValueString { get; set; } 
} 


//______________________________________________________________________ 
//______________________________________________________________________ 
//______________________________________________________________________ 



/// Class used to bind the combobox selections to. Must implement 
/// INotifyPropertyChanged in order to get the data binding to 
/// work correctly. 
public class ViewModelString : INotifyPropertyChanged 
{ 
    /// Need a void constructor in order to use as an object element 
    /// in the XAML. 
    public ViewModelString() 
    { 
    } 

    private string _langString = "en-GB"; 

    /// String property used in binding examples. 
    public string LangString 
    { 
     get { return _langString; } 
     set 
     { 
      if (_langString != value) 
      { 
       _langString = value; 
       NotifyPropertyChanged("LangString"); 
      } 
     } 
    } 

    #region INotifyPropertyChanged Members 

    /// Need to implement this interface in order to get data binding 
    /// to work properly. 
    private void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    #endregion 
} 

Я просто не знаю, что попробовать еще. Кто-нибудь имеет представление о том, что происходит, и почему combobox остается пустым?

Большое спасибо.

ответ

0

вы можете просто привязать к открытым свойствам

ItemsSource="{Binding _langListString}" 

не может работать, потому что _langListString не является публичной собственностью

+0

Большое спасибо, я сделал свойство «_langListString» общедоступным, но combobox остается пустым. – user2405703

0

По моему анализу проблема заключается в вашем DataContext.

DataContext = _viewModelString;

Если вы даете viewModelString для DataContext, вы должны указать там _langListString>, чтобы комбобокс знал, к какому элементу привязан.

Это то, что я хотел бы сделать:

  1. Добавить список _langListString = новый список(); к> ModelView.
  2. _langListString будет _viewModelString._langListString.add (Ваши объекты) - будьте осторожны, чтобы установить _langList при создании объекта _viewModelString.

Тогда я думаю, что все остальное будет работать.


Большое спасибо, у меня есть изменения, предложенные, но этот выпадающий все еще остается пустой :-(

Новая вида модели выглядит следующим образом:

/// Class used to bind the combobox selections to. Must implement 
/// INotifyPropertyChanged in order to get the data binding to 
/// work correctly. 
public class ViewModelString : INotifyPropertyChanged 
{ 
    public List<ComboBoxItemString> _langListString {get;set;} 
    /// Need a void constructor in order to use as an object element 
    /// in the XAML. 
    public ViewModelString() 
    { 
     // Localization settings 
     _langListString = new List<ComboBoxItemString>(); 
     ComboBoxItemString c; 
     c = new ComboBoxItemString(); c.ValueString = "en-GB"; _langListString.Add(c); 
     c = new ComboBoxItemString(); c.ValueString = "fr-FR"; _langListString.Add(c); 
     c = new ComboBoxItemString(); c.ValueString = "en-US"; _langListString.Add(c); 
    } 

    private string _langString = "en-GB"; 

    /// String property used in binding examples. 
    public string LangString 
    { 
     get { return _langString; } 
     set 
     { 
      if (_langString != value) 
      { 
       _langString = value; 
       NotifyPropertyChanged("LangString"); 
      } 
     } 
    } 

    #region INotifyPropertyChanged Members 

    /// Need to implement this interface in order to get data binding 
    /// to work properly. 
    private void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    #endregion 
} 

Объект данных :

// Object to bind the combobox selections to. 
    private ViewModelString _viewModelString; 

    public Window1() 
    { 
     // Set the data context for this window. 
     _viewModelString = new ViewModelString(); 
     DataContext = _viewModelString; 

     InitializeComponent(); 
    } 

И я пробовал все возможные ком бинация в combobox (_langListString, _viewModelString._langListString, _viewModelString) он просто не работает:

<ComboBox Height="23" HorizontalAlignment="Center" 
         VerticalAlignment="Top" Width="120" 
         ItemsSource="{Binding _langListString}" 
         DisplayMemberPath="ValueString" 
         SelectedValuePath="ValueString" 
         SelectedValue="{Binding LangString}" 
         /> 

Я склонен думать, что это XAML делает вещи действительно сложные без возможности отладки. Кто-нибудь может помочь ???

+0

Привет снова. У вашей собственности должен быть сеттер и геттер. так: public List _langListString {get; задавать; } – sexta13

+0

Sexta13 и все остальные, вы просто гений! Он работает сейчас. Я не уверен, почему, но который делает вас еще более гениальным ... Многие, многие, много спасибо ... – user2405703

+0

@ user2405703, приветствую :) голосуйте за меня +1 eheh;) Вам просто нужно подумать, что когда вы даете datacontext для элемента управления, каждое публичное свойство, по крайней мере, с геттером (я думаю, что установщик является необязательным и обязательным в двухстороннем переплетах), будет доступен для привязки. :) – sexta13