WPF:需要一些帮助绑定到UserControl

时间:2011-01-24 16:52:30

标签: wpf user-controls dependency-properties

我正在尝试构建一个包含2个listBox的UserControl。然后我不想为我使用UserControl的列表框设置itemsSources。

据我所知,这是DependencyProperties的用途。但是我没有成功这样做。我相信它主要与初始化的时间有关。任何关于我正在做的事情的指针,如何让它变得更好,这是受欢迎的。

这是我的用户控件,我正在学习,所以我想我可以做得更好

    <Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*" />
        <ColumnDefinition />
        <ColumnDefinition Width="2*" />
    </Grid.ColumnDefinitions>

    <ListBox Name="SET" ItemsSource="{Binding Path=SetCollection}" />

    <UniformGrid Rows="4" Grid.Column="1">

        <Grid />

        <Button Margin="10" Click="selectionBtnClick">--></Button>

        <Button Margin="10" Click="removeBtnClick">Remove</Button>

    </UniformGrid>

    <ListBox Name="SUBSET" ItemsSource="{Binding Path=SubsetCollection}" Grid.Column="2" />

</Grid>

代码隐藏

public partial class SubsetSelectionLists : UserControl
{
    public static DependencyProperty SetCollectionProperty = DependencyProperty.Register("SetCollection", typeof(CollectionView), typeof(SubsetSelectionLists));
    public static DependencyProperty SubsetCollectionProperty = DependencyProperty.Register("SubsetCollection", typeof(CollectionView), typeof(SubsetSelectionLists));

    public CollectionView SetCollection
    {
        get
        {
            return (CollectionView) GetValue(SetCollectionProperty);
        }
        set
        {
            SetValue(SetCollectionProperty, value);
        }
    }

    public CollectionView SubsetCollection
    {
        get
        {
            return (CollectionView)GetValue(SubsetCollectionProperty);
        }
        set
        {
            SetValue(SubsetCollectionProperty, value);
        }
    }

    public SubsetSelectionLists()
    {
        InitializeComponent();
    }

    private void selectionBtnClick(object sender, RoutedEventArgs e)
    {
        SUBSET.Items.Add(SET.SelectedItem);
    }

    private void removeBtnClick(object sender, RoutedEventArgs e)
    {
        SUBSET.Items.Remove(SUBSET.SelectedItem);
    }
}

我使用它的代码背后的代码

public partial class SomeWindow : Window
{
    ViewModel vm = new ViewModel();

    public SomeWindow()
    {
        InitializeComponent();
        NameOfUserControl.SetCollection = vm.InputView;
        NameOfUserControl.SubsetCollection = vm.OutputView;
    }
}

这里将SetCollection设置为inputView,然后绑定到DependencyProperty,切断我认为的原始绑定。知道我哪里错了吗?

聚苯乙烯。 subquestion - 因为我将从一个集合移动到另一个集合,我不应该确保集合保持对象不同的类型?我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

首先,您应该将SomeWindow中的DataContext属性设置为vm。这将允许在SomeWindow.xaml中使用非常简单的绑定表达式。

public partial class SomeWindow : Window
{
    ViewModel vm = new ViewModel();

    public SomeWindow()
    {
        InitializeComponent();
        this.DataContext = vm;
    }
}

在SomeWindow.xaml:

<local:SubsetSelectionLists
    SetCollection="{Binding Path=InputView}"
    SubsetCollection ="{Binding Path=OutputView}" />

有几种方法可以解决用户控件中的绑定问题:

设置数据上下文

将以下内容添加到用户控件的构造函数中。

this.DataContext = this;

Wpf绑定当前数据上下文,除非设置了特定的源(例如ElementName)。

使用与ElementName的绑定

您可以在绑定表达式中引用用户控件。

<UserControl x:Class="WpfApplication1.SubsetSelectionLists"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

             x:Name="root">
<Grid>
...
    <ListBox Name="SET"
             ItemsSource="{Binding Path=SetCollection, ElementName=root}" />
...
    <ListBox Name="SUBSET" Grid.Column="2"
             ItemsSource="{Binding Path=SubsetCollection, ElementName=root}" />

</Grid>
</UserControl>

绑定到VM

另一种方法是在SomeWindow中设置用户控件的数据上下文,并绑定到VM的Properties。然后,您可以删除用户控件的依赖项属性。

public partial class SomeWindow : Window
{
    ViewModel vm = new ViewModel();
    //with properties InputView and OutputView

    public SomeWindow()
    {
        InitializeComponent();
        NameOfUserControl.DataContext = vm;
    }
}

在用户控件中:

<Grid>
...
    <ListBox Name="SET"
             ItemsSource="{Binding Path=InputView}" />
...
    <ListBox Name="SUBSET" Grid.Column="2"
             ItemsSource="{Binding Path=OutputView}" />

</Grid>