【问题标题】:Adding ComboBoxItem to a combobox inside a user control (XAML/WPF)将 ComboBoxItem 添加到用户控件 (XAML/WPF) 内的组合框
【发布时间】:2011-02-16 15:03:06
【问题描述】:

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

现在我正在创建一个具有 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>

主窗口 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 等

非常感谢

【问题讨论】:

    标签: wpf xaml user-controls


    【解决方案1】:

    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 项绑定到字符串集合(或任何对象,您可以使用数据模板更改它们的外观)。您不会更改 ComboBox 本身,而是更改它绑定到的项目集合。

    【讨论】:

    • 感谢 David 提出 MVVM 的观点。我使用查理下面提到的文章中的 CollectionViewSource 以及关于 CollectionViewSource 使用的其他一些在线信息解决了我的问题。我赞成你的回答。
    【解决方案2】:

    This great article 来自 Dr. WPF 包含您需要的所有信息,以及您可以使用的所有选项的详尽说明。

    【讨论】:

    • 感谢您的链接。我使用 CollectionViewSource 解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 2014-12-15
    • 1970-01-01
    相关资源
    最近更新 更多