2013-02-01 66 views
2

我已經建立了一個自定義組合框,顯示當只讀設置一個文本框:WPF自定義組合框初始值設定

<local:BoolToVisibilityConverter FalseValue="Hidden" TrueValue="Visible" x:Key="BoolVis" /> 
<local:BoolToVisibilityConverter FalseValue="Visible" TrueValue="Hidden" x:Key="BoolVisRev" /> 

<Style TargetType="{x:Type local:ComboBoxG}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:ComboBoxG}"> 
       <Border Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}"> 
        <Grid> 
         <ComboBox ItemsSource="{TemplateBinding ItemsSource}" 
            DisplayMemberPath="{TemplateBinding DisplayMemberPath}" 
            SelectedValuePath="{TemplateBinding SelectedValuePath}" 
            SelectedIndex="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=SelectedIndex, Mode=TwoWay}" 
            Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsReadOnly, Converter={StaticResource BoolVisRev}}" 
            IsDropDownOpen="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsDropDownOpen, Mode=TwoWay}" 
            IsTabStop="False"> 
         </ComboBox> 
         <TextBox Text="{TemplateBinding Text}" 
           Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsReadOnly, Converter={StaticResource BoolVis}}" 
           IsTabStop="False"> 
         </TextBox> 
        </Grid> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

它的正常工作,除了如果我實例化,並設置一個值都一氣呵成。這不工作...

private void One_OnClick(object sender, RoutedEventArgs e) 
{ 
    cmb = new ComboBoxG(); 
    Stack.Children.Add(cmb); 

    var dict = new Dictionary<int, string> { { 0, "aaa" }, { 1, "bbb" }, { 2, "ccc" }, { 3, "ddd" }, }; 
    cmb.ItemsSource = dict; 
    cmb.DisplayMemberPath = "Value"; 
    cmb.SelectedValuePath = "Key"; 
    cmb.SelectedValue = 3; 
} 

......而這樣做......

private void One_OnClick(object sender, RoutedEventArgs e) 
{ 
    cmb = new ComboBoxG(); 
    Stack.Children.Add(cmb); 

    var dict = new Dictionary<int, string> { { 0, "aaa" }, { 1, "bbb" }, { 2, "ccc" }, { 3, "ddd" }, }; 
    cmb.ItemsSource = dict; 
    cmb.DisplayMemberPath = "Value"; 
    cmb.SelectedValuePath = "Key"; 
    cmb.Loaded += cmb_Loaded; 
} 

private void cmb_Loaded(object sender, RoutedEventArgs e) 
{ 
    cmb.SelectedValue = 3; 
} 

所以我可以解決它,但它正在使勁兒此控件的一些用途。有什麼建議嗎?

回答

1

我碰到這之前,以及和迄今唯一的半愉快的解決辦法做到這一切在一個方法 是讓消息隊列漏通過加載階段。請注意,我並不爲此感到驕傲,但WPF分階段處理事情,有時候你更願意將所有東西放在一起。你可以把cmd.SelectedValue = 3成,我想委託,但它的口味的問題......

 cmb = new ComboboxG(); 
     theStack.Children.Add(cmb); 

     var dict = new Dictionary<int, string> { { 0, "aaa" }, { 1, "bbb" }, { 2, "ccc" }, { 3, "ddd" }, }; 
     cmb.ItemsSource = dict; 
     cmb.DisplayMemberPath = "Value"; 
     cmb.SelectedValuePath = "Key"; 

     Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.Loaded); 

     cmb.SelectedValue = 3; 

要注意的是這將讓事件來運行,所以要小心重入!

+0

謝謝,我很高興這不僅僅是我。這是一個很好的解決方案。對於我現實世界中的大多數情況,價值將來自綁定,所以解決方法是關於更改綁定發生的時間。抱歉,我無法投票回答您的答案,但我還沒有獲得足夠的聲望點。 – johndsamuels

0

您是否嘗試過設置選定的索引?

private void One_OnClick(object sender, RoutedEventArgs e) 
{ 
    cmb = new ComboBoxG(); 
    Stack.Children.Add(cmb); 

    var dict = new Dictionary<int, string> { { 0, "aaa" }, { 1, "bbb" }, { 2, "ccc" }, { 3, "ddd" }, }; 
    cmb.ItemsSource = dict; 
    cmb.DisplayMemberPath = "Value"; 
    cmb.SelectedValuePath = "Key"; 
    cmb.SelectedIndex = 3; 
} 
+0

是的,行爲完全一樣。 – johndsamuels

0

嘗試設置的SelectedItem而不是指數

+0

即使在Loaded方法中也不起作用。 – johndsamuels