Как установить свойство SelectedIndex для ComboBox в DataTemplate - PullRequest
0 голосов
/ 17 октября 2011

Это может звучать тривиально, но у меня проблема с настройкой выбранного элемента в ComboBox;)

Что я хочу достичь:

Я хочу, чтобы первый элемент списка был выбран после загрузки страницы.

Код XAML:

               <DataTemplate>
                                    <ComboBox x:Name="DeviceComboBox" SelectedIndex="1" SelectionChanged="DeviceComboBox_SelectionChanged">
                                        <ComboBox.Items>
                                            <ComboBoxItem x:Name="Switch" Content="Switche"/>
                                            <ComboBoxItem x:Name="Firewall" Content="Firewalle"/>
                                            <ComboBoxItem x:Name="Host" Content="Hosty" />
                                            <ComboBoxItem x:Name="SRF1" Content="SRF1"/>
                                        </ComboBox.Items>
                                    </ComboBox>
                                </DataTemplate>

РЕЗУЛЬТАТ: AG_E_UKNOWN_ERROR [Строка: 49 Позиция: 55] Строка 49:

</ComboBox>

Сведения об ошибке

    w MS.Internal.XcpImports.MethodEx(IntPtr ptr, String name, CValue[] cvData)
    w MS.Internal.XcpImports.MethodEx(DependencyObject obj, String name)
    w MS.Internal.XcpImports.DataTemplate_LoadContent(DataTemplate template)
    w System.Windows.Controls.DataGridTemplateColumn.GenerateElement(DataGridCell cell, Object dataItem)
    w System.Windows.Controls.DataGrid.PopulateCellContent(Boolean isCellEdited, DataGridColumn dataGridColumn, DataGridRow dataGridRow, DataGridCell dataGridCell)
    w System.Windows.Controls.DataGrid.AddNewCellPrivate(DataGridRow row, DataGridColumn column)
    w System.Windows.Controls.DataGrid.CompleteCellsCollection(DataGridRow dataGridRow)
    w System.Windows.Controls.DataGrid.GenerateRow(Int32 rowIndex, Int32 slot, Object dataContext)
    w System.Windows.Controls.DataGrid.InsertElementAt(Int32 slot, Int32 rowIndex, Object item, DataGridRowGroupInfo groupInfo, Boolean isCollapsed)
    w System.Windows.Controls.DataGrid.InsertRowAt(Int32 rowIndex)
    w System.Windows.Controls.DataGridDataConnection.NotifyingDataSource_CollectionChanged(Object sender, NotifyCollectionChangedEventArgs e)
    w System.Windows.Data.PagedCollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs args)
    w System.Windows.Data.PagedCollectionView.ProcessAddEvent(Object addedItem, Int32 addIndex)
    w System.Windows.Data.PagedCollectionView.ProcessCollectionChanged(NotifyCollectionChangedEventArgs args) 
    w System.Windows.Data.PagedCollectionView.<.ctor>b__0(Object sender, NotifyCollectionChangedEventArgs args)
    w System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    w System.Collections.ObjectModel.ObservableCollection`1.InsertItem(Int32 index, T item)
    w System.Collections.ObjectModel.Collection`1.Add(T item)
    w LANOS.Views.Customers.onCustomerListLoaded(LoadOperation`1 loadOper)
    w System.ServiceModel.DomainServices.Client.DomainContext.<>c__DisplayClass13`1.<Load>b__11(LoadOperation lo)
    w System.ServiceModel.DomainServices.Client.LoadOperation.<>c__DisplayClass4`1.<Create>b__0(LoadOperation`1 arg)
    w System.ServiceModel.DomainServices.Client.LoadOperation`1.InvokeCompleteAction()
    w System.ServiceModel.DomainServices.Client.OperationBase.Complete(Object result)
    w System.ServiceModel.DomainServices.Client.LoadOperation.Complete(DomainClientResult result)
    w System.ServiceModel.DomainServices.Client.DomainContext.CompleteLoad(IAsyncResult asyncResult)
    w System.ServiceModel.DomainServices.Client.DomainContext.<>c__DisplayClass1b.<Load>b__17(Object )

Caused by: AG_E_UNKNOWN_ERROR [Line: 49 Position: 55]

    w MS.Internal.XcpImports.MethodEx(IntPtr ptr, String name, CValue[] cvData)
    w MS.Internal.XcpImports.MethodEx(DependencyObject obj, String name)
    w MS.Internal.XcpImports.DataTemplate_LoadContent(DataTemplate template)
    w System.Windows.Controls.DataGridTemplateColumn.GenerateElement(DataGridCell cell, Object dataItem)
    w System.Windows.Controls.DataGrid.PopulateCellContent(Boolean isCellEdited, DataGridColumn dataGridColumn, DataGridRow dataGridRow, DataGridCell dataGridCell)
    w System.Windows.Controls.DataGrid.AddNewCellPrivate(DataGridRow row, DataGridColumn column)
    w System.Windows.Controls.DataGrid.CompleteCellsCollection(DataGridRow dataGridRow)
    w System.Windows.Controls.DataGrid.GenerateRow(Int32 rowIndex, Int32 slot, Object dataContext)
    w System.Windows.Controls.DataGrid.InsertElementAt(Int32 slot, Int32 rowIndex, Object item, DataGridRowGroupInfo groupInfo, Boolean isCollapsed)
    w System.Windows.Controls.DataGrid.InsertRowAt(Int32 rowIndex)
    w System.Windows.Controls.DataGridDataConnection.NotifyingDataSource_CollectionChanged(Object sender, NotifyCollectionChangedEventArgs e)
    w System.Windows.Data.PagedCollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs args)
    w System.Windows.Data.PagedCollectionView.ProcessAddEvent(Object addedItem, Int32 addIndex)
    w System.Windows.Data.PagedCollectionView.ProcessCollectionChanged(NotifyCollectionChangedEventArgs args)
    w System.Windows.Data.PagedCollectionView.<.ctor>b__0(Object sender, NotifyCollectionChangedEventArgs args)
    w System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    w System.Collections.ObjectModel.ObservableCollection`1.InsertItem(Int32 index, T item)
    w System.Collections.ObjectModel.Collection`1.Add(T item)
    w LANOS.Views.Customers.onCustomerListLoaded(LoadOperation`1 loadOper)
    w System.ServiceModel.DomainServices.Client.DomainContext.<>c__DisplayClass13`1.<Load>b__11(LoadOperation lo)
    w System.ServiceModel.DomainServices.Client.LoadOperation.<>c__DisplayClass4`1.<Create>b__0(LoadOperation`1 arg)
    w System.ServiceModel.DomainServices.Client.LoadOperation`1.InvokeCompleteAction()
    w System.ServiceModel.DomainServices.Client.OperationBase.Complete(Object result)
    w System.ServiceModel.DomainServices.Client.LoadOperation.Complete(DomainClientResult result)
    w System.ServiceModel.DomainServices.Client.DomainContext.CompleteLoad(IAsyncResult asyncResult)
    w System.ServiceModel.DomainServices.Client.DomainContext.<>c__DisplayClass1b.<Load>b__17(Object )

Есть идеи?

Ответы [ 2 ]

1 голос
/ 17 октября 2011

Как я прочитал в ваших комментариях, вы хотите использовать ComboBox, который автоматически имеет выбор при загрузке. Поэтому я бы предложил две возможности: написание элемента управления, производного от ComboBox, или добавление поведения в ComboBox по умолчанию.

Получение из ComboBox:

public class MyComboBox : ComboBox
{
  public MyComboBox()
  {
    Loaded += ComboBoxLoaded;
  }

  private void ComboBoxLoaded(object sender, RoutedEventArgs e)
  {
    if(Count > 1)
    {
      SelectedIndex = 1;
    }
  }
}

Использование:

<MyComboBox>
  <ComboBoxItem x:Name="Switch" Content="Switche"/>
  <ComboBoxItem x:Name="Firewall" Content="Firewalle"/>
  <ComboBoxItem x:Name="Host" Content="Hosty" />
  <ComboBoxItem x:Name="SRF1" Content="SRF1"/>
</MyComboBox>

Реализующее поведение:

Класс поведения позволяет добавлять поведение к элементу управления с помощью xaml. Поведение закодировано.

public class ComboBoxSelectionBehavior:Behavior<ComboBox>
{
  protected override void OnAttached()
  {
    base.OnAttached();
    AssociatedObject.Loaded += ComboBoxLoaded;
  }

  protected override void OnDetaching()
  {
    AssociatedObject.Loaded -= ComboBoxLoaded;
    base.OnDetaching();
  }

  private void ComboBoxLoaded(object sender, RoutedEventArgs e)
  {
    if(Count > 1)
    {
      SelectedIndex = 1;
    }
  }
}

Использование:

<ComboBox>
  <Interactivity:Interaction.Behaviors>
    <Behaviors:ComboBoxSelectionBehavior/>
  </Interactivity:Interaction.Behaviors>
  <ComboBoxItem x:Name="Switch" Content="Switche"/>
  <ComboBoxItem x:Name="Firewall" Content="Firewalle"/>
  <ComboBoxItem x:Name="Host" Content="Hosty" />
  <ComboBoxItem x:Name="SRF1" Content="SRF1"/>
</ComboBox>

Обратите внимание, что для использования поведения вам необходимо установить Blend SDK.

0 голосов
/ 17 октября 2011

Я подозреваю, что вы получаете ошибку из-за обработчика событий SelectionChanged в DataTemplate.Я думаю, DataGrid, в котором вы используете этот шаблон, не может найти обработчик событий.Зачем вам нужен этот обработчик событий?

Я получаю похожее сообщение об ошибке со следующим XAML:

MainPage.xaml:

<UserControl x:Class="Example.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">
    <UserControl.Resources>
        <ResourceDictionary Source="Dictionary1.xaml" />
    </UserControl.Resources>
    <ItemsControl ItemsSource="ABC" ItemTemplate="{StaticResource failTemplate}" />
</UserControl>

Dictionary1.xaml:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <DataTemplate x:Name="failTemplate">
        <ComboBox SelectionChanged="ComboBox_SelectionChanged">
            <ComboBoxItem Content="AAA" />
            <ComboBoxItem Content="BBB" />
            <ComboBoxItem Content="CCC" />
        </ComboBox>
    </DataTemplate>
</ResourceDictionary>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...