2014-11-14 2 views
0

XAMLСвязывание COMBOBOX внутри Listview к ObservableCollection <string>

<UserControl x:Class="PatientsInscrit_GMF.ListDisplay" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:custom="clr-namespace:PatientsInscrit_GMF" 
      DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="25"></RowDefinition> 
      <RowDefinition></RowDefinition> 
     </Grid.RowDefinitions> 
     <ListView Grid.Row="1" Margin="0,0,0,0" x:Name ="FileList"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Header="Tag" Width="Auto"> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <ComboBox ></ComboBox> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
       </GridView> 
      </ListView.View> 
     </ListView> 
    </Grid> 
</UserControl> 

.cs

namespace PatientsInscrit_GMF 
{ 
    public partial class ListDisplay : UserControl 
    { 
     private ObservableCollection<string> _tags; 

     public ObservableCollection<string> Tags 
     { 
      get { return _tags; } 
     } 

     public ListDisplay() 
     { 
      InitializeComponent(); 
      _tags = new ObservableCollection<string>(); 
      List<string> tags = Facade.Instance.RetrieveTags(); 
      foreach(string s in tags) 
      { 
       _tags.Add(s); 
      } 
     } 
    } 
} 

Как BIND Теги к моему Combobox, которая является одной из многих колонок в моем Listview?

Я попытался

ItemsSource = "{Binding Tags}" 

But The выпадающий остается пустым. Я точно знаю, что список фасадного списка не пуст, так как при его создании я добавляю 2 тега по умолчанию, чтобы он не был пустым.

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

Пожалуйста, помогите :)

+0

Не уверен, что я последую за тобой? ItemsSource = {binding ...} thats binding? Как я уже сказал, я попробовал несколько решений, XAML я опубликовал чистое состояние, в котором мне нужно добавить привязку. вы должны, по крайней мере, прочитать весь вопрос – Fawar

ответ

1

Я считаю, что в то время (первоначально) Tags свойство забирается, то _tags не был инициализирован. После инициализации _tags вы можете поднять Tags изменение свойства (путем внедрения INotifyPropertyChanged). Однако это свойство просто необходимо инициализировать (изменить) один раз. Поэтому реализовать такой интерфейс не требуется. Вы можете попробовать следующий код, чтобы убедиться, что в то время Tags забирается, то данные будут инициализированы:

public ObservableCollection<string> Tags { 
    get { 
     if(_tags == null){ 
     //move your code after InitializeComponent() to here 
     _tags = new ObservableCollection<string>(); 
     List<string> tags = Facade.Instance.RetrieveTags(); 
     foreach(string s in tags) { 
      _tags.Add(s); 
     } 
     } 
     return _tags; 
    } 
} 

В XAML:

<ComboBox ItemsSource="{Binding Tags, 
      RelativeSource={RelativeSource AncestorType=UserControl}}"></ComboBox> 
+0

INotifyPropertyChanged по умолчанию реализован в ObservableCollection (класс microsoft), поэтому мне не нужно это делать.Я попробовал ваше решение, и у меня все еще нет ничего внутри моего списка. Тем не менее, я сохраню идею создания Lazy для этого объекта :) – Fawar

+0

@Fawar не уверен, почему он не работает. Но вы неправильно поняли, что я сказал здесь. Я не имею в виду «ObservableCollection», я имею в виду ваш класс *** ListDisplay ***. Как вы могли так ошибиться? «Теги» являются свойством этого класса, не так ли? изменение свойства для «Теги» означает, что вы должны реализовать 'INotifyPropertyChanged' для вашего класса. –

+0

. Список Display - это CS XAMl, если он не загружается во время XAML, в структуре WPF существует огромная проблема;) – Fawar

1

Для DataBind выполните следующие действия:

1) Убедитесь, что вы установили DataContext (в теге UserControl) в DataContext="{Binding RelativeSource={RelativeSource Self}}"

2) вы должны изменить позицию sSource связывание в вашем ComboBox, чтобы: ItemsSource="{Binding SomePropertyName}"

3) Вы должны реализовать `INotifyPropertyChanged» в поддержке CS файла

4) Для реализации этого свойства используют следующее:

#region INotifyPorpertyChanged Memebers 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void NotifyPropertyChanged(string propertyName = "") 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    #endregion 

5) Сделать свойство типа ObservableCollection типа требуемого объекта. Это свойство является свойством, которым ограничивается ComboBoxis.

например:

private ObservableCollection<SomeDataType> _myPrivateData; 
public ObservableCollection<SomeDataType> SomePropertyName { get { return _myPrivateData; } set { _myPrivateData= value; NotifyPropertyChanged("SomePropertyName"); } } 

Это заботится о связывании данных части. Теперь каждый раз, когда вы перезагружаете коллекцию, привязанную DataGrid к вашему DataGrid, будет обновляться, потому что вызывается NotifyPropertyChanged.

+0

Я пробовал это. Это не сработало. Кроме того, ObersableCollection - это класс microsoft, который должен использоваться в процессе связывания, поскольку он реализует PropertyChangedEvent. Поэтому все, что я должен был сделать, чтобы проверить ваше решение, - это добавить DataContext. У меня все еще было пустое поле со списком. – Fawar

+0

Так вы реализовали INotifyPropertychanged? –

+0

http://msdn.microsoft.com/en-us/library/ms668604(v=vs.110).aspx Просто пойдите и прочитайте это, это уже в – Fawar

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