1

我是 XAML/Wpf 表单的新手,所以这个项目可能有点超出我的能力。我想制作一个调度程序,它基本上将一堆“工作”添加到表单中,每个都有自己的能力,如点击事件等,但在大多数情况下,它们是具有背景和设定大小的标签。

这就像我在 Winforms 中所做的(删除数据)一样,但添加到表单中非常慢。我希望 xaml 的某种数据绑定和用户控件能帮助我。

我希望调度程序如何工作

会有大量这样的工作,理想情况下我认为每一行可能是它自己的用户控件或每个部分(这里标记为装配单元)。

我有一些代码可以将作业放置到窗口上,但是没有用户控件,也没有行或节标签。在 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>

在代码中,我只有一个 List(Of List(Of String)) 并且我将每一行添加为一个新的字符串列表,然后将其绑定到 sched。这甚至是正确的前进方向吗?任何帮助都将不胜感激。

4

1 回答 1

3

您似乎正朝着正确的方向前进,但是我建议您在继续之前阅读 MVVM,以便您能够真正了解DataBindingWPF 模板系统如何以及如何从中受益。 关于 MVVM 的 Prism 文档是一个很好的起点,但是通过简单的搜索,还有无数其他地方可以了解 MVVM。

它的要点是你DataTemplates是一个好的开始,但你可以走得更远。DataTemplates您可以使用 CLR 对象(MVVM 术语中的 ViewModel),然后定义(视图)以直观地表示这些 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属性时,它将自动应用于它找到的该类型的任何实例。

于 2013-04-23T13:31:28.850 回答