这就是我想要做的:
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的数据?
我正在使用MVVM Light在WPF中编写一些数据可视化代码.这是一个片段:
<Window x:Class="EventBlockVisualization.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ignore="http://www.ignore.com"
Title="MainWindow"
mc:Ignorable="d ignore"
DataContext="{Binding Main, Source={StaticResource Locator}}">
<Window.Resources>
<ItemsPanelTemplate x:Key="GraphRowItemsPanelTemplate">
<StackPanel IsItemsHost="True" Orientation="Horizontal"/>
</ItemsPanelTemplate>
</Window.Resources>
<Grid IsSharedSizeScope="True">
<ScrollViewer Margin="8" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.CanContentScroll="True">
<ItemsControl x:Name="GraphItemsControl" Margin="8" ItemsSource="{Binding VibeEvents, Mode=OneTime}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="NameWidthSizeGroup" Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="NameTextBlock" Text="{Binding Name}" Grid.Column="0" Margin="4,0"/>
<ItemsControl x:Name="GraphRowItemsControl" ItemsSource="{Binding VibeEventViewModels, Mode=OneTime}" ItemsPanel="{DynamicResource GraphRowItemsPanelTemplate}" Grid.Column="1" Margin="4,0">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid HorizontalAlignment="Left" VerticalAlignment="Center" Height="10">
<TextBlock x:Name="FGTitleTextBox" Text="{Binding FGTitle}" Visibility="Collapsed"/>
<Button Margin="1,0,0,0" Width="{Binding LengthInSeconds}" HorizontalAlignment="Left" Background="{Binding BackgroundColor}" …Run Code Online (Sandbox Code Playgroud) 这是场景:
换句话说,视图由两个主服务器提供服务,即用户输入和后端输入.一个例子是多用户游戏,其具有由用户输入控制的视觉效果,但也可以具有由一些后端输入(例如tcp/ip)控制的相同视觉效果.另一个例子是终端模拟器,它获取用户输入,但也从其他来源获取数据,无论是telnet还是串行等.
我正在考虑为视觉编写WPF自定义控件.换句话说,它是一个黑盒子,可以解释输入并显示结果.将用户输入到此自定义控件很容易,因为可以监听适当的事件并根据需要处理它们.但是,如何从后端监听输入?公开绑定到的依赖项属性没有意义但是在使用数据调用的视觉上公开方法也没有意义.
另一种选择是MVVM架构,其中Model是后端数据源,View Model完成所有工作.它同时获取后端数据(通过模型)和用户输入(通过适当的命令绑定或其他一些),并且它适当地理解这些并绑定到View以显示这些更改.
自定义控件的优点是它可以作为一个控制自己的控件使用,这样消费者只需要做很少的工作就可以使用它,但问题是从后端获取数据.MVVM方法是有利的,因为它整齐地封装了处理逻辑,视图等.问题是必须为每个后端重复这种模式.因此,使视觉非常裸露,并将所有处理逻辑暴露在控制之外.基本上我想让它非常容易消费,这样有人可以使用它而不需要添加太多的外部逻辑来进行处理等.它们提供的只是它们的后端数据源,它们被输入到视觉中.
对不起,这是一个冗长的帖子,但我正在学习WPF,这对我来说是一个有趣的设计问题.欢迎所有想法,评论等.
谢谢阅读.