公开MVVM中构建的用户控件的属性

4
有很多类似于这个问题的问题,但我仍然无法得到我真正想要的东西,所有这些问题都有一些与我的不同之处,那就是: 我有一个:
  • 在名为的类库项目中单独构建;
  • 项目有一个控件的View和它的ViewModel;
  • UserControl将其视图中的一些控件和UI元素属性绑定到在UCProject中声明的ViewModel中的属性;
  • 如何将ViewModel属性显示或公开或使其可访问以供可能托管此UserControl的项目(例如)的页面或窗口使用;

我正在构建此UserControl,我希望为其构建事件、属性...并希望其他人将其用作给定的程序集提供给他们,因此其代码不可访问,他们只能使用它,我想遵守MVVM模式,但我对如何实现没有清晰的想法,我应该在UserControl View的CodeBehind中编写这些属性和事件还是将它们放在ViewModel中,在这种情况下,我如何从外部访问它们,就像我们日常使用第三方控件一样。

3个回答

4
如果我理解得正确,您想将子UserControl的ViewModel属性暴露给包含它的父根元素,该元素可能是窗口或其他UserControl。
有两种方法可以实现:
首先,DataContext DP可继承,即除非显式设置为其他值,否则子控件会从父控件继承它。因此,您可以使用公共ViewModel并将其设置为父UserControl上的DataContext,这样两者都可以访问其属性。
其次,在需要父和子UserControl具有单独的ViewModels情况下,您始终可以通过DataContext访问子ViewModel的属性。让我举个例子:
<UserControl x:Name="ParentUserControl">
   <StackPanel>
      <local:ChildUserControl x:Name="Child"/>
      <TextBlock Text="{Binding DataContext.PropertyName, ElementName=Child}"/>
   </StackPanel>
</UserControl>

此处的 PropertyName 是 ChildUserControl 的 ViewModel 中的属性。

在此示例中,TextBlock位于 ParentUserControl 中,并绑定到 ChildUserControl 的 ViewModel 中的属性。


我该如何将其暴露给外部,而它又在ViewModel中声明,我的意思是这样我就可以像这样访问它 UserControlInstance.Propertie1 = Value,就像我们每天使用任何第三方控件一样。 - AymenDaoudi
你在这里混淆了事情。UserControlInstance.Propertie1 = Value 表示 Propertie1 是控件本身的属性,而不是它的 ViewModel 的属性。然而,如果你想要访问 ViewModel 中的属性,你需要像我在答案中提到的那样获取 DataContext。 - Rohit Vats
没有任何问题。如果你只对从外部访问UserControl属性感兴趣,那么这段代码完全没问题 - <TextBlock Text="{Binding PropertyName, ElementName=Child}"/> - Rohit Vats
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/44050/discussion-between-aymendaoudi-and-rohit-vats - AymenDaoudi
1
你还在寻找问题的答案吗?我以为你的问题已经解决了。 - Rohit Vats
显示剩余4条评论

0

我必须在CodeBehind中使用DependencyProperties实现这些属性,这是最好的方法。


0

你没有明确声明你对这些项目的哪些部分有控制权,所以我假设你可以更改它们的所有部分。基本上,你需要在用户控件中使用依赖属性。首先,将视图绑定到ViewModel,当你将用户控件添加到视图中时,它将有效地继承DataContext,并且你可以将创建的依赖属性绑定到ViewModel的各个部分。在用户控件本身中,你将各种FrameworkElements绑定到用户控件中的依赖属性,而不是直接绑定到ViewModel本身。

有意义吗?


1
我可以控制全局对象,UserControl项目已经开发并打包成程序集供其他开发人员使用,就像我们使用第三方控件一样。消费者开发人员无法访问UserControl的代码,那么我该如何在ViewModel中公开我为此UserControl构建的属性?或者我必须在代码后台编写它们吗? - AymenDaoudi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接