如何设置UserControl

时间:2014-03-07 11:53:11

标签: wpf mvvm dependency-properties

在应用程序中,我有(简化)任务:

该应用程序管理有关人员的信息。这些人存放在某个地方(无关紧要)。 用户可以在列表中添加和删除人员。

人员名单(在计划中经常使用)如下所示:

<UserControl>
...
    <StackPanel>
        <ListBox 
            ItemsSource="{Binding Persons}" 
            SelectedItem="{Binding SelectedPerson}"
            SelectionMode="Single"/>

        <StackPanel Orientation="Horizontal">
            <Button Content="Add Person" Command="{Binding AddPersonCommand}" />
            <Button Content="Remove Person" Command="{Binding RemovePersonCommand}" />
        </StackPanel>
    </StackPanel>
...
</UserControl>

后面有一个我想用于实现的ViewModel。

现在我想把这个控件嵌入到另一个控件/窗口中,如下所示:

<personcontrol:PersonControl PersonsCollectionDP="{Binding PersonsFromMainVM}" SelectedPersonDP="{Binding SelectedPersonFromMainVM}" />

PersonsVM SelectedPersonVM 是嵌入PersonControl-UC, PersonsDP 的UC / Window虚拟机中的属性SelectedPersonDP 是PersonControl-UC的DependencyProperty。)

我遇到的问题是将UC的属性作为DependencyProperty并且(同时)在UC-ViewModel中具有属性。

我该如何实现?


更新1

找到this link我的问题到底在哪里讨论但仍未得到解答。也许有人有新想法......

2 个答案:

答案 0 :(得分:0)

关于datacontext的全部内容。您可以将绑定保留在usercontrol定义中,稍后将嵌入UC绑定datacontext的部分保存到提供人员数据源的相应VM中。

<Window>
    <personcontrol:PersonControl DataContext="{Binding PersonsVM}" />
</Window>

在VM中你会有

public class WindowVM 
{
   public PersonsUCProviderVM PersonsVM {get;set;}
}

public class PersonsVM
{
   public List<Person> Persons {get;set;}
   public Person SelectedPerson {get;set;}
   public ICommand AddPersonCommand {get;set;}
   public ICommand RemovePersonCommand {get;set;}
}

答案 1 :(得分:0)

编辑:

通常在使用usercontrol和DP时使用elementname绑定。(从不将DataContext设置为self)

<personcontrol:PersonControl PersonsCollectionDP="{Binding PersonsFromMainVM}" SelectedPersonDP="{Binding SelectedPersonFromMainVM}" />

那么你的usercontrol东西应该是这样的

<UserControl x:Name="uc">
<StackPanel>
    <ListBox 
        ItemsSource="{Binding ElementName=uc, Path=PersonsCollectionDP}" 
        SelectedItem="{Binding ElementName=uc, Path=SelectedPersonDP}"
        SelectionMode="Single"/>
</StackPanel>
</UserControl>