Свойство CheckedItems для пользовательского элемента управления CheckBoxList в Silverlight - PullRequest
1 голос
/ 14 декабря 2009

Мне нужно реализовать элемент управления CheckBoxList со свойствами ItemsSource и CheckedItems. Элементы из ItemsSource должны отображаться как отмеченные флажки, если CheckedItems содержит эти значения или не отмечены иным образом. Также мне нужна двусторонняя поддержка привязки данных для свойства CheckedItems (значение этого свойства должно обновляться, когда пользователь нажимает на флажки).

Вот код, который, вероятно, поможет понять мою проблему

XAML:

<UserControl x:Class="Namespace.Controls.CheckBoxList" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ListBox x:Name="LayoutRoot">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <CheckBox Content="{Binding}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</UserControl>

Код позади:

public partial class CheckBoxList : UserControl
{
    public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(CheckBoxList), null);
    public static readonly DependencyProperty CheckedItemsProperty = DependencyProperty.Register("CheckedItems", typeof(IEnumerable), typeof(CheckBoxList), null);

    public IEnumerable ItemsSource
    {
        get { return (IEnumerable)GetValue(ItemsSourceProperty); }
        set { SetValue(ItemsSourceProperty, value); }
    }
    public IEnumerable CheckedItems
    {
        get { return (IEnumerable)GetValue(CheckedItemsProperty); }
        set { SetValue(CheckedItemsProperty, value); }
    }

    public CheckBoxList()
    {
        InitializeComponent();
        LayoutRoot.SetBinding(ItemsControl.ItemsSourceProperty, new Binding("ItemsSource") { Source = this });
    }
}

Я думаю, что мне нужно привязать ListBox к UserControl с помощью пользовательского конвертера, который будет возвращать коллекцию элементов с дополнительным свойством IsChecked, но это работает только в случае односторонней привязки данных.

Похоже, мне нужно двустороннее связывание с двумя свойствами одновременно, но я не знаю, как реализовать это, и буду признателен за любую помощь в этом вопросе.

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 14 декабря 2009

Прежде всего вы должны рассмотреть возможность получения из ListBox, а не UserControl. ListBox уже делает то, что вы хотите.

Во-вторых, рассмотрим один из способов привязки к IList. Затем вы можете добавить и удалить все записи в этот список, поскольку соответствующие элементы выбраны.

Вместо того, чтобы пытаться связать элемент управления CheckBox в шаблоне элемента, вы создаете копию стилей ListBox, поместите их в Generic.xaml в качестве стиля вашего нового элемента управления. Затем измените невыбранные и выбранные визуальные состояния, используя установленный и не отмеченный флажок как часть визуального вида.

Теперь вы можете присоединиться к событию SelectionChanged и использовать список AddedItems аргументов события, чтобы добавить в связанный IList, и список RemovedItems, чтобы удалить элементы из связанного списка.

Вам необходимо очистить и повторно добавить набор элементов в список SelectedItems списка, когда либо назначен ваш CheckedItems, либо изменен ItemsSource.

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

0 голосов
/ 14 декабря 2009

Добавьте наблюдаемую коллекцию для вашего источника данных со списком в ваш текстовый текст:

private ObservableCollection<MyItem> _myItems;
public ObservableCollection<MyItem> MyItems
{
    get { return _searchByFields; }
    set
    {
        _myItems = value;
    }
}

Добавьте класс для хранения данных о ваших флажках:

public class MyItem
{
  public bool Checked {get; set; }
  public string MyItemValue { set ; set; }
}

Затем в вашем шаблоне данных свяжите список со списком, а ваш шаблон данных - с соответствующими свойствами MyItem:

<UserControl x:Class="Namespace.Controls.CheckBoxList"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">    
    <ListBox x:Name="LayoutRoot"
             DataContext="[Dataconext here]"
             ItemsSource={Binding MyItems}>        
        <ListBox.ItemTemplate>
            <DataTemplate>
                <CheckBox IsChecked="{Binding Checked, Mode=TwoWay}" 
                          Content="{Binding MyItemValue}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</UserControl>

Не забудьте установить DataContext привязки к соответствующему классу (возможно, вы делаете это в XAML или, возможно, в коде)

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