2

ReadOnlyが設定されている場合にTextBoxとして表示されるカスタムComboBoxを作成しました。

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

だから私はそれを回避することができますが、それはこのコントロールのいくつかの使用のためにそれを厄介にします。何か提案をお願いします。

4

3 に答える 3

1

私も以前にこれに遭遇しましたが、これまでのところ、これをすべて1つの方法で行うための唯一の半快適な回避策は、メッセージキューをLoadedステージから排出させることです。注:私はこれを誇りに思っていませんが、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;

これによりイベントが実行できるようになることに注意してください。再入可能性に注意してください。

于 2013-02-03T00:23:18.807 に答える
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;
}
于 2013-02-01T12:24:31.333 に答える
0

インデックスの代わりにSelectedItemを設定してみてください

于 2013-02-01T12:48:07.973 に答える