将ComboBoxItem添加到用户控件(XAML / WPF)内的组合框中

时间:2010-05-06 23:12:35

标签: wpf xaml user-controls

我目前正在学习如何在WPF中创建自定义控件。我使用Label和Text Box成功创建了一个简单的自定义控件。我能够允许通过DependencyProperty设置Label文本。

现在我正在创建一个具有ComboBox的用户控件。我需要允许从控件外部向此ComboBox添加项目。

为了实现这一点,我尝试了一个ItemsCollection类型的DependencyProperty,它将允许访问ComboBox的Items属性(我的控件样本中的DP被命名为'CbItems')。但是我收到错误,因为Combobox的Items属性是ReadOnly。

控制XAML

<UserControl x:Class="MyWpfApp.Controls.MyControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="Auto" Width="Auto">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions> 
        <Label Grid.Column="0" Content="{Binding FieldLabel}"></Label>       
        <ComboBox Name="cmb"  Grid.Column="1" Width="150"></ComboBox>
    </Grid>
</UserControl>

MainWindow XAML

<Window x:Class="MyWpfApp.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:ctl="clr-namespace:MyWpfApp.Controls"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <ctl:MyControl>
            <ctl:MyControl.CbItems>
                <ComboBoxItem>Hello</ComboBoxItem>
                <ComboBoxItem>World</ComboBoxItem>
                <ComboBoxItem>Hi</ComboBoxItem>
            </ctl:LobCombox.CbItems>
        </ctl:LobCombox>
    </Grid>
</Window>

我想知道实现此功能的正确方法是什么。我相信对此的答案也可能有助于其他控件,如GridView等

非常感谢

2 个答案:

答案 0 :(得分:2)

This great article来自博士。 WPF 包含您需要的所有信息,并详细说明您可以使用的所有选项。

答案 1 :(得分:2)

WPF通常通过绑定实现许多目标;这是一种需要一些习惯的范式转变。以下是一些工作代码的快速示例:

<强> Window1.xaml

<Window
x:Class="ComboBoxSpike.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1"
Height="300"
Width="300">
<StackPanel>
    <ComboBox
        ItemsSource="{Binding ComboBoxItems}" />
    <Button
        x:Name="AddToComboBox"
        Content="Add an item to combo box"
        Click="AddToComboBox_Click" />
</StackPanel>
</Window>

<强> Window1.xaml.cs

 public partial class Window1 : Window
{
    private ViewModel _viewModel;
    public static int Counter;

    public Window1()
    {
        InitializeComponent();
        _viewModel = new ViewModel();
        this.DataContext = _viewModel;
    }

    private void AddToComboBox_Click(object sender, RoutedEventArgs e)
    {
        _viewModel.ComboBoxItems.Add("ComboBoxItem" + Counter);
    }
}

public class ViewModel
{
    public ViewModel()
    {
        this.ComboBoxItems = new ObservableCollection<string>();
    }

    public ObservableCollection<string> ComboBoxItems { get; set; }


  }

这个想法是你的ComboBox项绑定到一个字符串集合(或任何对象,你可以用datatemplates更改它们的外观)。您不会对ComboBox本身进行更改,而是对其绑定的项目集合进行更改。