Wpf 在运行时和设计时将ViewModels分配给UserControls
我正在用MVVM Light在WPF中编写一些数据可视化代码。这里有一个片段:Wpf 在运行时和设计时将ViewModels分配给UserControls,wpf,mvvm,wpf-controls,mvvm-light,Wpf,Mvvm,Wpf Controls,Mvvm Light,我正在用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"
<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}" BorderBrush="#FF2186A1">
<Button.ToolTip>
<ToolTip>
<StackPanel>
<TextBlock FontWeight="Bold" Text="{Binding FGTitle}"/>
<TextBlock Text="{Binding LengthText}"/>
</StackPanel>
</ToolTip>
</Button.ToolTip>
</Button>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Grid>
</Window>
当我在Expression Blend中设计UserControl时,这将非常有用,因为定位器可以提供充满虚拟数据的ViewModel。但是在运行时发生了什么;主ViewModel中集合提供的UserControl的ViewModel类的实例如何覆盖该绑定?主窗口在设计时也会出现同样的问题。如果我在主窗口的外观上使用Expression Blend,那么该绑定如何被设计时主ViewModel中集合提供的UserControl的ViewModel类的实例覆盖
有许多问题和答案已经涉及到这一点:
对于这篇文章长度的问题,我很抱歉!我不知道在设计一个用户控件时如何使用MVVM Light,该控件将成为主窗口集合中项目的可视控件,特别是如何设置三个绑定:运行时视图模型、主窗口的设计时视图模型及其用户控件的实例化,以及为用户控件单独设计时间视图模型。我认为您将事情复杂化了: 有什么问题吗
<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>
<MyShinyUserControl DataContext={Binding}/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Grid>
将每个VibeEvent绑定到用户控件的DataContext。在用户控件本身中,我建议创建设计时DataContext以简化设计。设计时DataContext如下所示:
<UserControl x:Class="EMC.Windows.AlarmsModule.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:AlarmsModule="clr-namespace:EMC.Windows.AlarmsModule" d:DesignHeight="300"
d:DesignWidth="300"
d:DataContext="{d:DesignInstance Type=AlarmsModule:Alarm}"
>
这将使您能够构建用户控件,并在其中包含设计时数据。它非常简单,不需要太多(如果有)脚手架。基于以下我可以想到的最简单的示例,使用UserControl在MVVM Light中显示列表的内容
为了完整起见,我将包含所有代码,这些代码尽量简短,同时仍然在用户控件的视图模型和主视图模型中提供与运行时数据不同的设计时数据
首先是定位器VMUCExample/ViewModel/viewmodellator.cs:
使用GalaSoft.MvvmLight.Ioc;
使用Microsoft.Practices.ServiceLocation;
命名空间VMUCExample.ViewModel
{
公共类ViewModelLocator
{
静态ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(()=>SimpleIoc.Default);
SimpleIoc.Default.Register();
SimpleIoc.Default.Register建议放置d:DataContext
,以便在设计用户控件时,Expression Blend所需的设计时绑定不会阻止运行时所需的数据上下文,也不会阻止在Expression Blend中设计主窗口时父级提供的数据上下文尽管如此,这并不是保罗·斯托维尔(Paul Stovell)和@LBugnion中描述为MVVM光的方法
另一个视图文件是VMUCExample\MainWindow.xaml:
示例应用程序本身仅在一列中绘制十个矩形:
我知道这太简单了,但希望能显示出正在使用的三个潜在数据集:
用户控件的设计时间(#FF7878粉彩
<UserControl x:Class="EMC.Windows.AlarmsModule.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:AlarmsModule="clr-namespace:EMC.Windows.AlarmsModule" d:DesignHeight="300"
d:DesignWidth="300"
d:DataContext="{d:DesignInstance Type=AlarmsModule:Alarm}"
>