WPF-ComboBox не заполняется, когда внутри элемента управления ленты

Я использую DevExpress WPF controls suite.

Я добавил элемент управления ленты внутри окна и добавил два поля со списком внутри элемента управления ленты. Код для него ниже.

MainView.код XAML

<dxr:RibbonDefaultPageCategory>
 <dxr:RibbonPage Caption="Home">
 <dxr:RibbonPageGroup Caption="Operations">
   <dxb:BarButtonItem Content="Open" GlyphSize="Large" ItemClick="Open_ButtonClick"/>
      <dxb:BarButtonItem Content="Print" GlyphSize="Large" ItemClick="Print_ButtonClick"/>
 </dxr:RibbonPageGroup>

 <dxr:RibbonPageGroup Caption="Site">
     <dxb:BarStaticItem>
        <dxb:BarStaticItem.ContentTemplate>
           <DataTemplate>
               <dxe:ComboBoxEdit x_Name="siteComboBox" Width="150" Height="20" 
                    ItemsSource="{Binding Site}" SelectedItem="{Binding SelectedSite}"/>                                       
            </DataTemplate>
         </dxb:BarStaticItem.ContentTemplate>
       </dxb:BarStaticItem>
   </dxr:RibbonPageGroup>

   <dxr:RibbonPageGroup Caption="Plan Type">
       <dxb:BarStaticItem>
           <dxb:BarStaticItem.ContentTemplate>
               <DataTemplate> 
                   <dxe:ComboBoxEdit x_Name="planTypeComboBox" Width="150" Height="20"
                        MaxWidth="150" MaxHeight="100">
                      <dxe:ComboBoxEdit.Items >
                      <system:String>First</system:String>
                      <system:String>Second</system:String>
                      </dxe:ComboBoxEdit.Items>        
                   </dxe:ComboBoxEdit>
                </DataTemplate>
            </dxb:BarStaticItem.ContentTemplate>
        </dxb:BarStaticItem>
     </dxr:RibbonPageGroup>
   </dxr:RibbonPage>

MainViewModel.код XAML.цезий

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new MainViewModel();
    }

MainViewModel.цезий

 public class MainViewModel
{
    private IList<string> sites = new List<string>();
    private string selectedSite;

    private IList<string> planType = new List<string>();
    private string selectedPlanType; 

    /// <summary>
    /// Initializes a new instance of the <see cref="MainViewModel"/> class.
    /// </summary>
    public MainViewModel()
    {
        PopulateComboBoxes();
    }

    /// <summary>
    /// Populates the combo boxes.
    /// </summary>
    private void PopulateComboBoxes()
    {
        Site = new List<string>() {"First", "Second"};
    }

    public IList<string> Site
    {
        get
        {
            return sites;   
        }

        set
        {
            sites = value;
        }
    }

    public string SelectedSite
    {
        get
        {
            return selectedSite; 
        }

        set
        {
            selectedSite = value;
        }
    }
}

Что я заметил, так это то , что я создал тестовое приложение для заполнения полей со списком с помощью ItemsSourceи SelectedItemоно отлично работает в тестовом приложении. Однако, как только я реализую то же самое внутри элемента управления ленты, поля со списком не заполняются.

Если я жестко кодирую элементы ComboBox, используя <system:String>их, они, кажется, работают просто хорошо.

Кто-нибудь, пожалуйста, дайте мне знать, как исправить эту проблему?

UPDATEANSWER: найдено обойти и причина для поля со списком не заполняется был

Причиной проблемы стало то, что BarStaticItem.Свойство Content имеет значение Null. В этом случае контекст данных для элемента управления ComboBoxEdit, расположенного в шаблоне содержимого BarStaticItem, пуст.

<dxr:RibbonControl DockPanel.Dock="Top" RibbonStyle="Office2010" Name="ribbon">
            <dxr:RibbonDefaultPageCategory>
                <dxr:RibbonPage Caption="Home">
                    <dxr:RibbonPageGroup Caption="Operations">
                        <dxb:BarButtonItem Content="Open" GlyphSize="Large" />
                        <dxb:BarButtonItem Content="Print" GlyphSize="Large" />
                    </dxr:RibbonPageGroup>

                    <dxr:RibbonPageGroup Caption="Site">
                        <dxb:BarStaticItem Content="{Binding}">
                            <dxb:BarStaticItem.ContentTemplate>
                                <DataTemplate>
                                    <dxe:ComboBoxEdit x_Name="siteComboBox" 
                                         Width="150" Height="20" 
                                         ItemsSource="{Binding Site}" 
                                         SelectedItem="{Binding SelectedSite}"/>
                                </DataTemplate>
                            </dxb:BarStaticItem.ContentTemplate>
                        </dxb:BarStaticItem>
                    </dxr:RibbonPageGroup>

                    <dxr:RibbonPageGroup Caption="Plan Type">
                        <dxb:BarStaticItem Content="{Binding}" 
                            IsEnabled="{Binding SelectedSite, 
                            Converter={dxmvvm:ObjectToBooleanConverter}}">
                            <dxb:BarStaticItem.ContentTemplate>
                                <DataTemplate>
                                    <dxe:ComboBoxEdit 
                                      x_Name="planTypeComboBox" 
                                      Width="150" Height="20"
                                      MaxWidth="150" MaxHeight="100"   
                                      ItemsSource="{Binding PlanType}"  
                                      SelectedItem="{Binding SelectedPlanType}">                                                                                        
                                    </dxe:ComboBoxEdit>
                                </DataTemplate>
                            </dxb:BarStaticItem.ContentTemplate>
                        </dxb:BarStaticItem>
                    </dxr:RibbonPageGroup>

                </dxr:RibbonPage>
            </dxr:RibbonDefaultPageCategory>
        </dxr:RibbonControl>     

2 ответа

  1. Это из-за ошибки привязки, попробуйте

    <dxe:ComboBoxEdit Width="150" 
                      Height="20" 
                      ItemsSource="{Binding Path=DataContext.Site,
                                            RelativeSource={RelativeSource 
                                            Mode=FindAncestor, 
                                            AncestorType={x:Type dxr:RibbonPageGroup}}}"/>
    

    или что-то вроде этого. Я не могу воспроизвести полное дерево сейчас. Вы можете открыть Snoopили новую Visual Studioфункцию LiveVisualTreeи исправить ошибку самостоятельно, также вы можете включить отображение ошибок привязки в окне вывода, которые будут подготовлены в будущем.

  2. Причиной проблемы было то, что BarStaticItem.Contentсвойство имеет Nullзначение. В этом случае контекст данных для элемента ComboBoxEditуправления, расположенного в шаблоне содержимого BarStaticItem, пуст.

    <dxr:RibbonControl DockPanel.Dock="Top" RibbonStyle="Office2010" Name="ribbon">
                <dxr:RibbonDefaultPageCategory>
                    <dxr:RibbonPage Caption="Home">
                        <dxr:RibbonPageGroup Caption="Operations">
                            <dxb:BarButtonItem Content="Open" GlyphSize="Large" />
                            <dxb:BarButtonItem Content="Print" GlyphSize="Large" />
                        </dxr:RibbonPageGroup>
    
                        <dxr:RibbonPageGroup Caption="Site">
                            <dxb:BarStaticItem Content="{Binding}">
                                <dxb:BarStaticItem.ContentTemplate>
                                    <DataTemplate>
                                        <dxe:ComboBoxEdit x_Name="siteComboBox" 
                                             Width="150" Height="20" 
                                             ItemsSource="{Binding Site}" 
                                             SelectedItem="{Binding SelectedSite}"/>
                                    </DataTemplate>
                                </dxb:BarStaticItem.ContentTemplate>
                            </dxb:BarStaticItem>
                        </dxr:RibbonPageGroup>
    
                        <dxr:RibbonPageGroup Caption="Plan Type">
                            <dxb:BarStaticItem Content="{Binding}" 
                                IsEnabled="{Binding SelectedSite, 
                                Converter={dxmvvm:ObjectToBooleanConverter}}">
                                <dxb:BarStaticItem.ContentTemplate>
                                    <DataTemplate>
                                        <dxe:ComboBoxEdit 
                                          x_Name="planTypeComboBox" 
                                          Width="150" Height="20"
                                          MaxWidth="150" MaxHeight="100"   
                                          ItemsSource="{Binding PlanType}"  
                                          SelectedItem="{Binding SelectedPlanType}">                                                                                        
                                        </dxe:ComboBoxEdit>
                                    </DataTemplate>
                                </dxb:BarStaticItem.ContentTemplate>
                            </dxb:BarStaticItem>
                        </dxr:RibbonPageGroup>
    
                    </dxr:RibbonPage>
                </dxr:RibbonDefaultPageCategory>
            </dxr:RibbonControl>