在应用程序中,我有(简化)任务:
该应用程序管理有关人员的信息。这些人存放在某个地方(无关紧要)。 用户可以在列表中添加和删除人员。
人员名单(在计划中经常使用)如下所示:
<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我的问题到底在哪里讨论但仍未得到解答。也许有人有新想法......
答案 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>