2012-01-26 63 views
1

更新1在名單上啓動時選擇第一個組合框項

這不是「在啓動時選擇第N項」 ...它更像是選擇坐在那裏定義爲初始項目的項目並更新組合框。我需要將ItemsSource設置爲CompositeCollection,其中一個項目被定義爲指定(不必是項目0),並設置啓動時選擇的提及的項目。綁定設置爲該項目的內容的事實在這裏起着至關重要的作用。下面的代碼只是演示一個示例應用程序。 UPDATE OF

END 1

我遇到一個小問題,我希望我能得到的解決方案在這裏。我有一個組合框,我想用啓動時選擇的特定項目對它進行初始化。問題是,當我開始應用程序控制是空的,並得到它的價值在第一次打開。我已經成功地提取出有問題的代碼,可能最簡單的形式(排除儘可能多的變量,因爲我可以),它看起來如下的窗口

<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> 

代碼背後

XAML代碼:

簡單視圖模型:

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

我試圖使代碼複製過去E-工作。

顯然所有的方法表現相同(選定的價值,指數,項目)。如果我將List設置爲Items而不是ItemsSource,則問題消失,但這不是一個選項。請記住,這是更復雜的代碼的簡化表示,我嘗試使用CompositeCollection,但我用數組替換它來檢查這是不是導致問題。

+0

你想的第一個項目是默認選擇? –

+0

是的,我想要選擇這個特定的項目。行爲是,組合框的內容一旦我第一次打開它,我啓動應用程序就會更新。 – Skomialek

+0

好吧,我看到你已經改變了標題 - 我想選擇項目 - 在我的示例代碼中它是項目0,但它可以是任何索引,值等等。這個概念很重要 - 我選擇了項目(它被選爲屬性,如果我檢查SelectedItem它是正確的值)但組合框的內容不會得到更新,直到我打開它.... – Skomialek

回答

2

下面是我如何設置第一組合框項目一個完整的例子:

XAML

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

視圖模型

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設置除了列表中的第一項以外的東西,那麼您將需要設置選擇dItem指向列表中的對象SelectedItem = m_ComboItems [1]將把「BB」作爲選定的項目。

希望這有助於!

+0

嗨,感謝你的建議。問題是我想使用CompositeCollection,我不想只綁定到一個列表。我想在開始時選擇一個固定的項目。所以這不能解決我的問題,但謝謝:) – Skomialek

+0

此外,在這種情況下值AA,BB不是由相同的列表提供(是不同類型)我知道我可以得到更多的通用列表(對象)和有數據模板照顧顯示特定的項目,但我的目標不是提供像視圖模型分隔符的東西。我希望虛擬機提供功能和視圖來照顧以任何形狀或形式顯示這些:) – Skomialek

+0

嗨,出於好奇,有什麼特別的原因,爲什麼你要使用CompositeCollection? – emybob

2

如果你想盡快的的ItemSource得到初始化您的組合框,設置IsSynchronizedWithCurrentItem真爲你的組合框像這樣選擇的第一個項目 -

<ComboBox IsSynchronizedWithCurrentItem="True"/> 
+0

嗨,試過這一個,似乎沒有解決這個問題。行爲在True,False和Null值中都是相同的。 – Skomialek

相關問題