我有一组带有附加命令和逻辑的控件,它们以相同的方式不断重用.我决定创建一个包含所有常用控件和逻辑的用户控件.
但是我还需要控件才能保存可以命名的内容.我尝试了以下方法:
<UserControl.ContentTemplate>
<DataTemplate>
<Button>a reused button</Button>
<ContentPresenter Content="{TemplateBinding Content}"/>
<Button>a reused button</Button>
</DataTemplate>
</UserControl.ContentTemplate>
Run Code Online (Sandbox Code Playgroud)
但是,似乎无法命名放置在用户控件内的任何内容.例如,如果我以下列方式使用控件:
<lib:UserControl1>
<Button Name="buttonName">content</Button>
</lib:UserControl1>
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
无法在元素"Button"上设置Name属性值"buttonName".'Button'属于元素'UserControl1'的范围,在另一个范围内定义时,已经注册了一个名称.
如果我删除buttonName,然后编译,但我需要能够命名内容.我怎样才能做到这一点?
我对MVVM架构设计很陌生......
我最近一直在努力寻找一个已经为此目的编写的合适的控件,但没有运气,所以我从另一个类似的控件中重用了部分XAML并自己制作了.
我想要实现的是:
有一个可重用的View(usercontrol)+ viewmodel(要绑定到),以便能够在其他视图中使用作为模式覆盖,显示禁用视图其余部分的对话框,并在其上显示一个对话框.

我是如何实现它的:
pseudoXAML:
<usercontrol /customerview/ ...>
<grid>
<grid x:Name="content">
<various form content />
</grid>
<ctrl:Dialog DataContext="{Binding DialogModel}" Message="{Binding Message}" Commands="{Binding Commands}" IsShown="{Binding IsShown}" BlockedUI="{Binding ElementName=content}" />
</grid>
</usercontrol>
Run Code Online (Sandbox Code Playgroud)
因此,模态对话框从Customer视图模型的DialogModel属性获取datacontext,并绑定命令和消息.它也会绑定到对话框显示(绑定到IsShown)时需要禁用的其他元素(此处为'content').当您单击对话框中的某个按钮时,将调用关联的命令,该命令只调用在viewmodel的构造函数中传递的关联操作.
这样我就可以从Customer视图模型中调用对话框视图模型上的对话框的Show()和Hide(),并根据需要更改对话框视图模型.
它会一次只给我一个对话但是没问题.我还认为对话框视图模型将保持单一性,因为单元测试将涵盖在构造函数中使用Actions创建后应该创建的命令的调用.对话框视图会有几行代码隐藏,但很少而且非常愚蠢(setter getters,几乎没有代码).
我关心的是:
这个可以吗?我有什么问题可以进入吗?这会破坏一些MVVM原则吗?
非常感谢!
编辑:我发布了我的完整解决方案,以便您可以更好地了解.欢迎任何建筑评论.如果您看到一些可以纠正的语法,则帖子会被标记为社区维基.