WPF用户控件项控件绑定问题

时间:2011-08-25 12:29:22

标签: wpf user-controls

我在WPF中创建一个用户控件,它是一种Item控件。此控件将有两列,一列将显示复选框,另一列将显示与复选框对应的说明。将此控件部署到WPF表单时,它将与集合绑定。根据收集项目,复选框的数量将显示在项目控件中,另一列项目控件将与某些收集属性绑定。

现在问题是,如何在复选框描述列的用户控件上定义绑定?在用户控制方面,我们不知道收集的属性,它可以是任何东西。

3 个答案:

答案 0 :(得分:0)

您应该创建一个模型类,一个用于表示数据的辅助类。例如,创建一个具有两个属性的类:

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

如果您的数据动态变化,并且您必须在用户界面中显示此更改,请让CheckModel实施INotifyPropertyChanged

然后在主模型中创建ObservableCollection<CheckModel>并将用户控件绑定到它。使用某种策略在CheckModel个实例中映射您的底层实际数据。

答案 1 :(得分:0)

您必须在用户控件中创建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>

如果您发现我已将绑定复选框和文本框绑定到我在用户控件中创建的依赖项属性。

使用usercontrol时,可以绑定DependencyProperty

<Grid>
                <local:UserControl1 IsChecked="{Binding yourBinding}" Text="{Binding yourBinding}"/>
            </Grid>

答案 2 :(得分:0)

我的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

属性

我想要一种方法,在客户端应用程序上为DP CheckBoxDisplayColumn提供的“EmployeeName”成为我的CheckBoxList控件用于显示与性别或年龄相对的复选框的属性

基本上,我想使控件通用,以便使用它的用户可以指定要绑定到的集合和要从集合绑定到的显示列