【问题标题】:How can I set the selected property in a custom user control which inherits XAML ComboBox?如何在继承 XAML ComboBox 的自定义用户控件中设置 selected 属性?
【发布时间】:2010-12-02 08:35:32
【问题描述】:

我已经构建了一个 自定义用户控件,它继承了 ComboBox 并具有

KeyValuePair<bool, string>

我想设置这个 ComboBox 的 boolean 默认值,这样当 true 时它显示“Yes”,当它为 false 时显示“ ”。

在下面的代码中,当我将选定的值设置为 true 时,ComboBox 正确显示“是”。

但是当我将选定的值设置为 false 时,ComboBox 仍为空白。

我需要对此用户控件执行什么操作,以便当我将所选值设置为 false 时,它​​会显示“否”?

Window1.xaml:

<Window x:Class="TestYesNoComboBox234.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestYesNoComboBox234"
    Title="Window1" Height="300" Width="300">
    <StackPanel HorizontalAlignment="Left" Margin="10">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="Contract available?" Margin="0 0 10 0"/>
            <local:YesNoComboBox Width="60" Height="22" 
               x:Name="ContractAvailable"/>
        </StackPanel>
    </StackPanel>
</Window>

Window1.xaml.cs:

using System.Windows;

namespace TestYesNoComboBox234
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            //ContractAvailable.SelectedValue = true; //correctly sets "Yes"
            ContractAvailable.SelectedValue = false; //incorrectly does not select anything
        }
    }
}

YesNoComboBox.xaml:

<ComboBox x:Class="TestYesNoComboBox234.YesNoComboBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Value}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

YesNoComboBox.xaml.cs:

using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;

namespace TestYesNoComboBox234
{
    public partial class YesNoComboBox : ComboBox
    {

        public YesNoComboBox()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(YesNoComboBox_Loaded);
        }

        void YesNoComboBox_Loaded(object sender, RoutedEventArgs e)
        {
            SelectedValuePath = "Key";
            Items.Add(new KeyValuePair<bool, string>(true, "Yes"));
            Items.Add(new KeyValuePair<bool, string>(false, "No"));
        }

    }
}

【问题讨论】:

    标签: wpf xaml combobox


    【解决方案1】:

    发现问题。窗口构造函数发生在 YesNoComboBox_Loaded 之前。通过在组合框实际具有值之前设置选定的值,由于某种原因它只能选择第一项(尝试反转添加 KeyValuePairs 并将 SelectedValue 设置为 false 的方式,然后尝试 true。False 将起作用,true 不会)。我也尝试在 Window_Loaded 事件中执行此操作,但 Window_Loaded 也发生在 YesNoComboBox_Loaded 之前。因此,您需要做的是在组合框的构造函数中添加 KeyValuePair 项,然后在 Window_Loaded 中设置选定的值(因为窗口构造函数也发生在组合框构造函数之前)。代码如下:

    窗口:

    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
    
        private void window1_Loaded(object sender, RoutedEventArgs e)
        {
            ContractAvailable.SelectedValue = true;
        }
    }
    

    YesNoComboBox:

    public partial class YesNoComboBox : ComboBox
    {
        public YesNoComboBox()
        {
            InitializeComponent();
    
            SelectedValuePath = "Key";
    
            Items.Add(new KeyValuePair<bool, string>(true, "Yes"));
            Items.Add(new KeyValuePair<bool, string>(false, "No"));
        }
    }
    

    【讨论】:

    • 是的,就是这样,谢谢。我让它与在窗口的构造函数中定义的 true/false 一起工作。
    猜你喜欢
    • 2018-12-21
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多