Jon*_*ell 15 wpf user-controls dependency-properties mvvm
这就是我想要做的:
UserControl是我希望被其他开发者消费的.我希望最终用户能够使用依赖属性来使用我的控件.
<lib:ControlView ControlsText={Binding Path=UsersOwnViewModelText} />
Run Code Online (Sandbox Code Playgroud)我正在使用MVVM模式.
我将我的ViewModels绑定到他们的View使用 <DataTemplates>
<DataTemplate DataType="{x:Type local:ControlViewModel}">
<local:ControlView />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)所以我有两个问题:
我是否认为如果在XAML中使用UserControl,那么UserControl必须将ViewModel设置为DataContext控件Loaded事件触发时的方式而不是使用<DataTemplate>方法?
如何允许用户将数据绑定到我的控件的依赖项属性,同时仍然是绑定到我的ViewModel的数据?
Ken*_*art 25
您应该将两个用例分开:
重要的是,后者取决于前者 - 反之亦然.
用例1将使用依赖项属性,模板绑定,以及制作常规WPF控件的所有内容:
MyControl.cs:
public class MyControl : Control
{
// dependency properties and other logic
}
Run Code Online (Sandbox Code Playgroud)
Generic.xaml:
<ControlTemplate Type="local:MyControl">
<!-- define the default look in here, using template bindings to bind to your d-props -->
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)
然后,您将用例2定义为:
MyViewModel.cs:
public class MyViewModel : ViewModel
{
// properties and business logic
}
Run Code Online (Sandbox Code Playgroud)
MyView.xaml:
<UserControl ...>
<local:MyControl SomeProperty="{Binding SomePropertyOnViewModel}" .../>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
两个世界中最好的分离.其他开发人员只依赖于控件,控件可能(也可能应该)与视图模型和视图完全不同.
Bry*_*hle 10
首先,如果您正在开发一个将被其他人使用的UserControl,我认为MVVM不是一个好选择.一个无形的控制是你真正应该开发的.Jeremiah Morrill有一篇关于这个主题的博客文章.
话虽如此,如果您有默认的公共构造函数,可以使用XAML设置datacontext.
在ControlView.xaml里面放了:
<UserControl.DataContext>
<local:ControlViewModel />
</UserControl.DataContext>
Run Code Online (Sandbox Code Playgroud)