Выберите первый элемент ComboBox в списке при запуске - PullRequest
1 голос
/ 26 января 2012

ОБНОВЛЕНИЕ 1

Речь идет не о «выбрать элемент nTH при запуске» ... это больше похоже на выбор находящегося там элемента, определенного как начальный элемент, и обновление поля со списком. Мне нужно установить ItemsSource как CompositeCollection, где один из элементов определен, как указано (необязательно должен быть элемент 0) и установить упомянутый элемент, выбранный при запуске. Факт привязки к содержанию предмета здесь играет решающую роль. Код ниже просто демонстрирует пример приложения.

КОНЕЦ ОБНОВЛЕНИЯ 1

Я столкнулся с небольшой проблемой, которую, я надеюсь, я смогу найти здесь. У меня есть поле со списком, и я хотел бы инициализировать его с конкретным элементом, выбранным при запуске. Проблема в том, что когда я запускаю приложение, оно становится пустым и получает его значение при первом открытии. Мне удалось извлечь проблемный код в простейшую форму (исключить столько переменных, сколько я мог), и это выглядит следующим образом

XAML-код для окна

<Window
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"
xmlns:loc ="clr-namespace:WpfApplication1"
x:Class="WpfApplication1.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="640" Height="480">

<StackPanel Orientation="Vertical">
    <StackPanel.Resources>
        <ComboBoxItem x:Key="toSelectInitially" Content="{Binding Path=ActiveItem,   Mode=OneWay}"/>
    </StackPanel.Resources>

    <ComboBox SelectedIndex="0"
              Height="30">
        <ComboBox.ItemsSource>
            <x:Array Type="{x:Type ComboBoxItem}">
                <ComboBoxItem Content="{Binding Path=ActiveItem, Mode=OneWay}"/>
                <ComboBoxItem Content="AAA"/>
                <ComboBoxItem Content="BBB"/>
            </x:Array>
        </ComboBox.ItemsSource>
    </ComboBox>

    <ComboBox SelectedItem="{StaticResource ResourceKey=toSelectInitially}"
              Height="30" Loaded="ComboBox_Loaded">
        <ComboBox.ItemsSource>
            <x:Array Type="{x:Type ComboBoxItem}">
                <StaticResource ResourceKey="toSelectInitially"/> 
                <ComboBoxItem Content="AAA"/>
                <ComboBoxItem Content="BBB"/>
            </x:Array>
        </ComboBox.ItemsSource>
    </ComboBox>

    <ComboBox SelectedValue="{Binding Path=ActiveItem, Mode=OneWay}"
              SelectedValuePath="Content"
              Height="30">
        <ComboBox.ItemsSource>
            <x:Array Type="{x:Type ComboBoxItem}">
                <ComboBoxItem Content="{Binding Path=ActiveItem, Mode=OneWay}"/>
                <ComboBoxItem Content="AAA"/>
                <ComboBoxItem Content="BBB"/>
            </x:Array>
        </ComboBox.ItemsSource>
    </ComboBox>

</StackPanel>


</Window>

Код:

namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        this.InitializeComponent();
        this.DataContext = new VMSimple();
    }
}
}

Простая модель представления:

using System;
using System.ComponentModel;

namespace WpfApplication1
{
class VMSimple : INotifyPropertyChanged
{
    public VMSimple()
    {
        ActiveItem = string.Concat("Active Item : ", Guid.NewGuid().ToString());
    }

    private string mActiveItem;
    public string ActiveItem
    {
        get { return mActiveItem; }
        private set
        {
            if (Equals(mActiveItem, value)) return;
            mActiveItem = value;
            OnPropertyChanged("ActiveItem");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
}

Я пытался заставить код копировать-вставить-работать.

Очевидно, что все подходы ведут себя одинаково (выбранное значение, индекс, элемент). Проблема исчезнет, ​​если я установлю список как Items вместо ItemsSource, он работает, но это не вариант. Помните, что это упрощенное представление более сложного кода, где я пытаюсь использовать CompositeCollection, но я заменил его массивом, чтобы проверить, не вызывает ли это проблемы.

Ответы [ 2 ]

2 голосов
/ 26 января 2012

Если вы хотите, чтобы ваш первый элемент был выбран сразу после инициализации itemSource для вашего комбинированного списка, установите для IsSynchronizedWithCurrentItem значение true для своего комбинированного списка, как это -

<ComboBox IsSynchronizedWithCurrentItem="True"/>
2 голосов
/ 26 января 2012

Вот полный пример того, как я устанавливаю первый элемент комбинированного списка:

XAML

   <ComboBox ItemsSource="{Binding Path=ComboItems}" SelectedItem="{Binding Path=SelectedItem, Mode=TwoWay}"/>

ViewModel

 public class ViewModel : INotifyPropertyChanged
{
    private List<string> m_ComboItems= new List<string>();
    private string m_SelectedItem;

    public ViewModel()
    {
        m_ComboItems.Add("AA");
        m_ComboItems.Add("BB");
        m_ComboItems.Add("CC");
        this.SelectedItem = m_ComboItems.First<string>();
    }

    public List<string> ComboItems
    {
        get { return m_ComboItems;}            
    }

    public string SelectedItem
    {
        get { return m_SelectedItem; }
        set
        {
            m_SelectedItem = value;
            this.OnPropertyChanged("SelectedItem");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

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

Если вы хотите изменить selectedItem на что-то отличное от первого элемента в списке, вам нужно будет установить SelectedItem для объекта в списке, например, SelectedItem = m_ComboItems [1] поместит "BB" в качестве выбранного элемента.

Надеюсь, это поможет!

...