Привязка выпадающего списка на ленте к наблюдаемой коллекции

#c# #wpf #binding #combobox #ribbon

#c# #wpf #привязка #выпадающий список #лента

Вопрос:

У меня есть ribbon combob box как:

 <r:RibbonComboBox DataContext="this"
                  SelectionBoxWidth="62"
                  VerticalAlignment="Center" 
                  IsEditable="True"  
                  Label="Saved Queries" 
                  Name="Saved_Queries"  
                  ToolTip="Select an item to run or edit" >
<r:RibbonGallery 
                  MaxColumnCount="1" 
                  Name="RibbonQu" 
                  ScrollViewer.VerticalScrollBarVisibility="Auto"
                  SelectionChanged="RibbonGallery_SelectionChanged" >
     <r:RibbonGalleryCategory ItemsSource="{Binding SavedXml}" >
            <r:RibbonGalleryItem Content="Green" Foreground="Green" />
            <r:RibbonGalleryItem Content="Blue" Foreground="Blue" />
            <r:RibbonGalleryItem Content="Orange" Foreground="Orange" />
     </r:RibbonGalleryCategory>
 </r:RibbonGallery>
  

Мне нужно привязать элементы comobobox к наблюдаемой коллекции следующим образом:

 private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        XmlDocument doc = new XmlDocument();
        doc.Load("QueryList.xml");

        XmlNodeList List = doc.SelectNodes("//Query");

        foreach (XmlElement element in List)
        {

            if (element == null) return;
            if (element != null)
            {
                //Saved_Queries.Items.Add(element.InnerText);

                _savedxml.Add(element.InnerText.ToString());  
            }
        }
    }
    public ObservableCollection<string> SavedXml
    {
        get { return _savedxml; }
    set{}
    }
  

Но я ничего не вижу в comobox, когда я его запускаю.Я думаю, что проблема связана с контекстом данных, который был установлен на другие в коде, поэтому в выпадающем списке я использую :
DataContext=»this»
но я все еще ничего не могу добиться. как я могу это сделать? Спасибо!

Ответ №1:

Как вы и подозревали, вы неправильно назначили DataContext.

Если вам нужно, чтобы в combo были только элементы в SavedXml, и на самом деле не нужно устанавливать его DataContext, попробуйте удалить DataContext="this" и добавить ItemsSource="{Binding SavedXml, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" .

Если вам действительно нужно задать DataContext, измените назначение на: DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" и затем ItemsSource="{Binding SavedXml}" .

В обоих случаях, поскольку SavedXml это не свойство зависимости и в нем не используется измененный интерфейс INotifyProperty, вы должны заполнить элементы перед InitializeComponent() запуском. Событие лучше: создайте SavedXml a DependencyProperty .