Добавление ComboBoxItem в комбинированный список внутри пользовательского элемента управления (XAML / WPF) - PullRequest
0 голосов
/ 07 мая 2010

В настоящее время я учусь создавать собственные элементы управления в WPF. Я успешно создал простой пользовательский элемент управления, используя метку и текстовое поле. Мне удалось разрешить установку текста метки с помощью DependencyProperty.

Теперь я создаю пользовательский элемент управления с ComboBox. Мне нужно разрешить добавлять элементы в этот ComboBox извне элемента управления.

Чтобы добиться этого, я попытался выставить свойство DependencyProperty типа ItemsCollection, и оно позволит получить доступ к свойству ComboBox's Items (DP в моем контрольном образце называется CbItems). Но я получаю ошибки, потому что свойство Items Combobox имеет значение 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 ]

2 голосов
/ 07 мая 2010

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, а в коллекцию элементов, к которой он привязан.

2 голосов
/ 07 мая 2010

Эта замечательная статья от Д-р.WPF содержит всю необходимую вам информацию и подробное объяснение всех вариантов, которые вы можете использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...