2013-04-23 111 views
1

我是XAML/Wpf表格的新手,所以也许这个项目有点超出我的能力。我想制作一个调度程序,它基本上为表单添加了一堆“作业”,每个人都有它自己的功能,例如点击事件等,但大多数情况下它们都是具有背景和设置大小的标签。使用WPF/XAML添加动态控件到表格

下面是我想要的东西,我在Winforms中做了(删除了数据),但是它添加到表单非常慢。我希望用xaml进行某种数据绑定和用户控制可以帮助我。

How I want the scheduler to hopefully work

将会有大量的这些工作,最好我想每一行可能是它自己的用户控件或每个部分(这里标示为装配单元)。

我有一些能够将作业放到窗口上的代码,但没有用户控件,也没有行或部分标签。它看起来像这样的XAML:

<Window.Resources> 
    <DataTemplate x:Key="Job"> 
      <Label Content="{Binding}" Height ="100" Width="100" BorderThickness="1" BorderBrush="Black"/> 
     </DataTemplate> 
    <DataTemplate x:Key="wrkCenterPanel"> 
     <ItemsControl ItemsSource="{Binding}" ItemTemplate="{DynamicResource job}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Vertical" Width="Auto" Height="Auto" > 

        </StackPanel> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
     </ItemsControl> 
    </DataTemplate> 
</Window.Resources> 

... 

    <Label Grid.Row="0" Grid.Column="0" Content="Production Scheduler" Width="Auto" Height="Auto" FontSize="40" FontWeight="Bold" HorizontalAlignment="Center" /> 
    <ScrollViewer Grid.Row="1" Grid.Column="0" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto"> 
     <ItemsControl x:Name="sched" ItemTemplate="{DynamicResource wrkCenterPanel}" /> 
    </ScrollViewer> 

在代码中,我只是有一个表(表(串))和我说的每一行作为一个新的字符串列表,然后将其绑定到章附表。这是否是正确的方向?任何帮助都将不胜感激。

回答

3

您确实似乎正朝着正确的方向前进,但是我建议您在继续之前阅读MVVM,以便您真正了解DataBinding和WPF模板系统将如何获益。 The Prism documentation on MVVM是一个很好的开始,但有无数其他地方可以通过简单搜索来了解MVVM。

它的精神是你的DataTemplates是一个好的开始,但是你可以走得更远。您可以使用CLR对象(ViewModels,使用MVVM术语),然后定义DataTemplates(视图)来直观地表示这些CLR对象,而不仅仅是使用字符串和字符串列表。

的结果是,你的XAML会是这个样子(不完整的,但示范):

<Window> 
    <Window.Resources> 
     <DataTemplate DataType="{x:Type vms:JobViewModel}"> 
      <Label Content="{Binding Name}" Height ="100" Width="100" BorderThickness="1" BorderBrush="Black"/> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type WorkCenterViewModel}"> 
      <ItemsControl ItemsSource="{Binding Jobs}"> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <StackPanel Orientation="Vertical" Width="Auto" Height="Auto" /> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
      </ItemsControl> 
     </DataTemplate> 
    </Window.Resources> 

    <ContentPresenter Content="{Binding WorkCenter}"/> 

</Window> 

而且你的CLR对象将是这个样子:

public class JobViewModel : ViewModel 
{ 
    private string _name; 

    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      _name = value; 
      RaisePropertyChanged("Name"); 
     } 
    } 
} 

public class WorkCenterViewModel : ViewModel 
{ 
    private ObservableCollection<JobViewModel> _jobs; 

    public ObservableCollection<JobViewModel> Jobs 
    { 
     get { return _jobs; } 
    } 
} 

当你定义DataTemplates不带x:Key属性,而是使用DataType属性代替,它将自动应用于它找到的那种类型的任何实例。

+0

CLR对象是否有新的用户控件?或类? – Loogawa 2013-04-23 13:58:32

+0

另外我如何使它可以从类型ViewModel继承? – Loogawa 2013-04-23 13:59:57

+1

CLR对象(ViewModels)是类。如果DataTemplates变得复杂,可以使用UseControls而不是在DataTemplate中定义VisualTree(可视化树就是UserControl)。我使用了一个假设的ViewModel基类,但是有几个实现--Prim有一个NotificationObject,并且有几个MVVM框架可以用于他们自己的实现。 [MVVM上的Wiki文章](http://en.wikipedia.org/wiki/Model_View_ViewModel)也有几个参考文献可以帮助您开始。 – 2013-04-23 14:16:22