2012-01-26 2 views
1

UPDATE 1Выберите первый элемент ComboBox в списке при запуске

Это не о «выберите NTH пункт при запуске» ... это больше похоже выберите элемент, который сидит, там определяется как в качестве исходного пункта и обновить поле со списком. Мне нужно установить ItemsSource как CompositeCollection, где один из элементов определен как заданный (не обязательно должен быть элемент 0) и установить указанный элемент при запуске. Важнейшую роль здесь играет тот факт, что Binding, установленный для Content of the item. В приведенном ниже коде показан пример приложения.

КОНЕЦ UPDATE 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> 

Код:

Простые ViewModel:

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)); 
    } 
} 
} 

Я попытался сделать код копирования прошлого е-работа.

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

+0

Вы хотите, чтобы первый элемент будет выбрано по умолчанию? –

+0

Да, я хочу, чтобы этот конкретный элемент был выбран. Поведение заключается в том, что содержимое поля со списком обновляется после того, как я открою его в первый раз, когда запустил приложение. – Skomialek

+0

Хорошо, я вижу, что вы изменили название - я хочу выбрать элемент - в моем примере кода это элемент 0, но это может быть любой индекс, значение и т. Д. Концепция имеет значение - я выбираю элемент (он выбран как свойство , и если я проверил SelectedItem, это верное значение), но содержимое поля со списком не будет обновляться до тех пор, пока я его не открою .... – Skomialek

ответ

2

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

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 к что-то иное, чем первый элемент в списке, тогда вам нужно будет установить Selecte dItem к объекту в списке, например. SelectedItem = m_ComboItems [1] поставит «BB» в качестве выбранного элемента.

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

+0

Привет, спасибо вы за это предложение. Проблема в том, что я хочу использовать CompositeCollection, и я не хочу связываться только с одним списком. Есть фиксированный элемент, который я хочу выбрать в начале. Так что это не решает мою конкретную проблему, но спасибо :) – Skomialek

+0

Кроме того, значения AA, BB не предоставляются одним и тем же списком в этом случае (имеют различный тип). Я знаю, что могу получить более общий список (объекта) и есть шаблон данных, который заботится о отображении отдельных элементов, но моя цель - не предоставлять такие вещи, как разделитель, из модели представления. Я хочу, чтобы VM обеспечивала функциональность и возможность заботиться о ее отображении в любой форме или форме :) – Skomialek

+0

Привет, из любопытства, есть ли какая-то особая причина, почему вы хотите использовать CompositeCollection? – emybob

2

В случае, если вы хотите, чтобы ваш первый пункт, который будет выбран, как только ItemSource инициализируются для выпадающего списка, установите IsSynchronizedWithCurrentItem к истинным для выпадающего списка, как это -

<ComboBox IsSynchronizedWithCurrentItem="True"/> 
+0

Привет, Пробовал это, похоже, не решает проблему. Поведение одинаково для значений True, False и Null. – Skomialek

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