Проблема привязки элемента управления пользовательского элемента управления WPF - PullRequest
0 голосов
/ 25 августа 2011

Я создаю пользовательский элемент управления в WPF, который является типом элемента управления Item. Этот элемент управления будет иметь две колонки, одна из которых будет отображать флажок, а другая отображает описание, соответствующее флажку. Когда этот элемент управления развернут в форме WPF, он будет связан с коллекцией. На основе элементов коллекции номер флажка будет отображаться в элементе управления элементом, а другой столбец элемента управления будет связан с некоторым свойством коллекции.

Теперь проблема в том, как определить привязку пользовательского элемента управления для столбца описания флажка? На пользовательском контроле мы не знаем о свойстве коллекции, это может быть что угодно.

Ответы [ 3 ]

0 голосов
/ 25 августа 2011

Вы должны создать DependencyProperty в вашем пользовательском элементе управления, который будет использоваться для привязки флажка и описания.Что-то вроде этого

public partial class UserControl1 : UserControl
    {


        public bool IsChecked
        {
            get { return (bool)GetValue(IsCheckedProperty); }
            set { SetValue(IsCheckedProperty, value); }
        }

        // Using a DependencyProperty as the backing store for IsChecked.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty IsCheckedProperty =
            DependencyProperty.Register("IsChecked", typeof(bool), typeof(UserControl1), new UIPropertyMetadata(false));



        public string Text
        {
            get { return (string)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }

        // Using a DependencyProperty as the backing store for Text.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TextProperty =
            DependencyProperty.Register("Text", typeof(string), typeof(UserControl1), new UIPropertyMetadata(string.Empty));


        public UserControl1()
        {
            InitializeComponent();

        }     

    }

И ваш usercontrol xaml выглядит следующим образом ..

<UserControl x:Class="WpfApplication1.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300" Name="Root">

    <StackPanel>
        <CheckBox IsChecked="{Binding IsChecked,ElementName=Root}"></CheckBox>
        <TextBlock Text="{Binding Text,ElementName=Root}"></TextBlock>
    </StackPanel>
</UserControl>

Если вы заметили, у меня есть флажок и текстовое поле в привязке к свойствам зависимости, которые я создал в пользователеcontrol.

когда вы используете пользовательский контроль, вы можете связать DependencyProperty

<Grid>
                <local:UserControl1 IsChecked="{Binding yourBinding}" Text="{Binding yourBinding}"/>
            </Grid>
0 голосов
/ 26 августа 2011

Мой пользовательский элемент управления CheckBoxList выглядит следующим образом

<UserControl x:Class="CheckBoxListControl.CheckBoxListControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<ScrollViewer  VerticalScrollBarVisibility="Auto">
    <StackPanel>
        <ListBox x:Name="CheckedListBox">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <CheckBox x:Name="templateCheckBox" Content="{Binding CheckBoxDisplayColumn}" VerticalAlignment="Center"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </StackPanel>
</ScrollViewer>

На этом пользовательском элементе управления ItemsSource и CheckBoxDisplayColumn являются DP, которые я хочу установить из моего клиентского приложения, как показано ниже

<userControl35:CheckBoxListControl Grid.Row="6" Grid.Column="0" 
                                       ItemsSource="{Binding personObservableCollection}"
                                       CheckBoxDisplayColumn="EmployeeName"></userControl35:CheckBoxListControl>

personObservableCollection относится к типу Employee, имеющему свойства EmployeeName, Age, Gender

Мне нужен способ, с помощью которого «EmployeeName», предоставляемое DP CheckBoxDisplayColumn в клиентском приложении, становится свойством, которое мой элемент управления CheckBoxList использует для отображения флажков в зависимости от пола или возраста

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

0 голосов
/ 25 августа 2011

Вы должны создать класс модели, вспомогательный класс для представления ваших данных.Например, создайте класс с двумя свойствами:

class CheckModel
{
   public bool Checked {get;set;}
   public string Description {get;set;}
}

Пусть CheckModel реализует INotifyPropertyChanged, если ваши данные изменяются динамически, и вам необходимо показать эти изменения в пользовательском интерфейсе.

, затем создайте вОсновная модель ObservableCollection<CheckModel> и привязать к ней свой пользовательский контроль.Используйте некоторую стратегию, чтобы отобразить ваши базовые реальные данные в CheckModel экземплярах.

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