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を読んDataBindingで、WPFテンプレートシステムがどのように役立つかを本当に理解できるようにすることをお勧めします. MVVM に関する Prism のドキュメントから始めるのが適切ですが、簡単な検索で MVVM について学べる場所は他にも無数にあります。

その要点は、あなたDataTemplatesが良いスタートを切ったということですが、さらに先に進むことができます. 文字列と文字列のリストを使用するだけでなく、CLR オブジェクト (MVVM 用語では ViewModel) を使用して、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:KeyDataType

于 2013-04-23T13:31:28.850 に答える