2017-03-02 9 views
1

さて、私はWPFとXAMLでかなり経験がないので、どのような指針やアドバイスをいただければ幸いです。UserControlsレンダリングされていません

私は私が働いているスケジューリングプログラムを用意しています。私はセットアップの手助けが必要です。私は以前は仕事をしていたが、正しく組織されていなかった。 MainWindowの初期化時にStackPanelに追加するViewModelにUI要素がありました。 MVVMスタイルのコーディングではありません。だから私は持っているものを表示するためにいくつかのビュー(UserControls)を作成し、ほとんどすべてが壊れた。

基本的に、いくつかのパラメータと異なるRoom ViewModelsのリストを持つSchedule ViewModelがあります。各Room ViewModelには、RoomEvent ViewModelのリストを含むRoomSchedule ViewModelがあります。

私は、表示が必要なもののコントロールを記述しようとしています。私は、ルームビューのリストボックスを持つスケジュールビューを作成しました。ルームビューはRoomEventビューを使用してルームのイベントを表示します。 RoomビューはWPF Extended ToolkitのTimelinePanelを使用し、残りのコントロールはかなり基本的なコントロールです。一般的な考え方は、モデルはViewModelにデータを提供し、ViewModelはそのデータを表示する必要があるものにマッサージします。だからイベントは自分自身を表示する方法を知っている必要があります。部屋は自分自身を表示する方法を知っていて、スケジュールは自分自身を表示する方法を知っている必要があります。

私が実行している問題は、xaml.csファイルまたはViewModelファイルから適切な場所にすべてを移動したため、コントロールがレンダリングされないことです。私は人々が同じ問題を抱えている他のSO投稿を読んできましたが、どれもこのような初心者のためにはうまくいかないようです。私は近いと思う、すべてのコントロールが作成されているように見え、DataContextが正しく設定されているが、何も表示されていない。

これは基本的に私がこれまで持っていたものです。私は簡潔のために、XAMLの定型のものオフのいくつかを左:

Schedule.xaml:

<StackPanel> 
    <ListBox ItemsSource="{Binding Rooms}" > 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <localcontrols:RoomView ScheduleStart="{Binding ElementName=ScheduleControl, Path=DataContext.Start}" 
      </DataTemplate> 
     <ListBox.ItemTemplate> 
    </ListBox> 
</StackPanel> 

RoomView.xaml:

<extended:TimelinePanel BeginDate="{Binding localcontrols:ScheduleStart}" EndDate="{Binding localcontrols:ScheduleEnd}" 
    <ItemsControl ItemsSource="{Binding Path=mRoomSchedule.mScheduledEvents}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <localcontrols:EventView /> 
      </DataTemplate> 
     </ItemsControls.ItemTemplate> 
    </ItemsControl> 
</extended:TimelinePanel> 

EventView.xaml:

<Border BorderThickness="1" BorderBrush="Black" extended:TimelinePanel.Date="{Binding mStartTime}" extended:TimelinePanel.DateEnd="{Binding mEndTime}"> 
    <TextBlock Background="{Binding mColor}" Text="{Binding mEventID}" /> 
</Border> 

ScheduleStartおよびScheduleEndは、RoomView.xaml.cで定義された依存関係プロパティです。 s。私の考えは、コンストラクタで設定されるStartEndのプロパティを持ち、ListBoxRoomViewは、これらのプロパティにバインドしてTimelinePanelのBeginDateEndDateを設定します。

+0

'=" {Binding localcontrols:ScheduleStart} "これは完全に間違っています。実際の解決策を知るには、あまりにも多くの手を振っています。このため、問題を特定する最小限のプロトタイプを作成することは、依頼する前の最初のステップです。いずれにしても、Snoopは実行時にバインディングを調べるのに最適なツールです。実際にバインドできるものが表示されます。そこに必要なデータを取得する方法のヒントが得られます。 – Will

答えて

0

あなたのバインディングが間違っている可能性があります。依存関係プロパティにバインドする必要がある場合は、ElementNameというバインディングの機能を使用して、どのコントロールを使用するかを指定し、ルートノードに名前を付けます。この場合はルートです。それを解決する一つの方法です。

<UserControl 
    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" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:local="clr-namespace:Weingartner.Controls" 
    x:Class="RoomView" 
    x:Name="Root"> 


    <extended:TimelinePanel 
     BeginDate="{Binding ElementName=Root, Path=ScheduleStart}" 
     EndDate="{Binding ElementName=Root, Path=ScheduleEnd}" 
    > 
     <ItemsControl ItemsSource="{Binding Path=mRoomSchedule.mScheduledEvents}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <localcontrols:EventView /> 
       </DataTemplate> 
      </ItemsControls.ItemTemplate> 
     </ItemsControl> 
    </extended:TimelinePanel> 



</UserControl> 
+0

それは私がやっていたことよりも意味がありますが、助けにはなりませんでした。ありがとうございました。 – Teravian

関連する問題