2016-10-01 2 views
0

ワークショップのスケジュールを構成するためのWPFダイアログを作成しようとしています。 左側には、教師の名前のための1列のリストビューがあります。 右側には、月曜日から金曜日までの曜日のワークブック、 とその他の5つの列の6つの列のリストビューがあります。WPF ListViewセルの取得を中止する

|教師| |ワークショップ|月| Tue |水|木|金|

A    WS-1   A B 
B    WS-2  C 
C    WS-3       B 

ユーザーはドラッグ&ドロップでスケジュールを設定する必要があります。教師Cは月曜日に ワークショップWS-2を教えています。

WinFormsでは、ドロップセルを取得するのは簡単な仕事でしたが、私はWPFでこれを取得する方法を見つけることができません。

ここにxamlコードのセクションがあります。

<ListView Name="_LV_Teacher" 
       SelectionMode="Single" 
       ItemsSource="{Binding}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn 
       DisplayMemberBinding="{Binding Path=Id}"   
       Width="0"/> 
      <GridViewColumn 
       DisplayMemberBinding="{Binding Path=TeachersName}" Header="Teacher"/> 
     </GridView> 
    </ListView.View> 
</ListView> 

<ListView Name="_LV_Schedule" 
      ItemsSource="{Binding}" 
      AlowDrop="True" 
      Drop="_LV_Teacher_Drop" > 
    <ListView.View> 
     <GridView> 
      <GridViewColumn 
      DisplayMemberBinding="{Binding Path=WorkshopId}" Width="0"/> 
      <GridViewColumn Header="Monday"/> 
      <GridViewColumn Header="Tuesday"/> 
      <GridViewColumn Header="Wednesday"/> 
      <GridViewColumn Header="Thursday"/> 
      <GridViewColumn Header="Friday"/> 
     </GridView> 
    </ListView.View> 
</ListView> 
+0

正しい答えとして私の答えをマークしてください。 http://stackoverflow.com/help/someone-answers – AnjumSKhan

答えて

0

DragDrop HowTo

ChallangeはDragDrop.DoDragDrop()で使用されるべき性質を把握することでした。我々は異なるListViewを持っているので、Teacherエンティティ自体を使うことは意味があります。私はソースTeacherListViewの左側からTextBlock.DataContextを使って取得します。 Drop targetTextBlockDataContextと設定します。

DataContextにはDataFormatsの値を使用していたので、IDataObject.GetFormats()を使用しました。

出力:

Appointment Schedule Output

以下のサンプルアプリケーションを参照してください。簡単なコピー/ペーストが可能です。優秀な答えをAnjumSKhanへ

Window1.xaml

<Window x:Class="WpfStackOverflow.MyDragDrop.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfStackOverflow.MyDragDrop" 
     Title="Window1" Height="472.557" Width="675.564"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="123*"/> 
      <ColumnDefinition Width="380*"/> 
     </Grid.ColumnDefinitions> 

     <ListView Margin="10,31,10,226" ItemsSource="{Binding TeacherData}"> 
      <ListView.Resources> 
       <Style x:Key="TbKey" TargetType="TextBlock"> 
        <EventSetter Event="MouseLeftButtonDown" Handler="Teacher_LeftButtonDown"/> 
        <EventSetter Event="DragEnter" Handler="Teacher_DragEnter"/> 

        <Setter Property="Background" Value="Yellow"/> 
        <Setter Property="AllowDrop" Value="True"/> 
       </Style> 
      </ListView.Resources> 
      <ListView.View> 
       <GridView> 
        <GridView.Columns> 
         <GridViewColumn Header="Teachers" Width="75"> 
          <GridViewColumn.CellTemplate> 
           <DataTemplate> 
            <TextBlock Text="{Binding Name}" Width="{Binding View.Columns[0].Width, RelativeSource={RelativeSource AncestorType=ListView, Mode=FindAncestor}}" 
               Style="{StaticResource TbKey}" /> 
           </DataTemplate> 
          </GridViewColumn.CellTemplate> 
         </GridViewColumn> 
        </GridView.Columns> 
       </GridView> 
      </ListView.View> 
     </ListView> 
     <ListView ItemsSource="{Binding AppointmentData}" Margin="13,31,10,226" Grid.Column="1" ScrollViewer.CanContentScroll="False"> 
      <ListView.Resources> 
       <Style x:Key="TbKey" TargetType="TextBlock"> 
        <EventSetter Event="MouseLeftButtonDown" Handler="WeekDay_LeftButtonDown"/> 
        <EventSetter Event="DragEnter" Handler="WeekDay_DragEnter"/> 
        <EventSetter Event="Drop" Handler="WeekDay_Drop"/> 
        <EventSetter Event="MouseRightButtonDown" Handler="WeekDay_MouseRightButtonDown"/> 

        <Setter Property="Background" Value="Yellow"/> 
        <Setter Property="AllowDrop" Value="True"/> 
        <Setter Property="DataContext" Value="{x:Null}"/> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding DataContext, RelativeSource={RelativeSource Self}}" Value="{x:Null}"> 
          <Setter Property="Background" Value="{x:Null}"/> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </ListView.Resources> 
      <ListView.View> 
       <GridView>      
        <GridView.Columns> 
         <GridViewColumn Header="Workshop" Width="75"> 
          <GridViewColumn.CellTemplate> 
           <DataTemplate> 
            <TextBlock Text="{Binding Workshop}"/> 
           </DataTemplate> 
          </GridViewColumn.CellTemplate> 
         </GridViewColumn> 
         <GridViewColumn x:Name="ColMon" Header="Mon" Width="45"> 
          <GridViewColumn.CellTemplate> 
           <DataTemplate> 
            <TextBlock DataContext="{Binding Mon, Mode=TwoWay}" Text="{Binding Name}" Width="{Binding View.Columns[1].Width, RelativeSource={RelativeSource AncestorType=ListView, Mode=FindAncestor}}" 
               Style="{StaticResource TbKey}" /> 
           </DataTemplate> 
          </GridViewColumn.CellTemplate> 
         </GridViewColumn> 
         <GridViewColumn Header="Tue" Width="45"> 
          <GridViewColumn.CellTemplate> 
           <DataTemplate> 
            <TextBlock DataContext="{Binding Tue, Mode=TwoWay}" Text="{Binding Name}" Width="{Binding View.Columns[1].Width, RelativeSource={RelativeSource AncestorType=ListView, Mode=FindAncestor}}" 
               Style="{StaticResource TbKey}" /> 
           </DataTemplate> 
          </GridViewColumn.CellTemplate> 
         </GridViewColumn> 
         <GridViewColumn Header="Wed" Width="45"> 
          <GridViewColumn.CellTemplate> 
           <DataTemplate> 
            <TextBlock DataContext="{Binding Wed, Mode=TwoWay}" Text="{Binding Name}" Width="{Binding View.Columns[1].Width, RelativeSource={RelativeSource AncestorType=ListView, Mode=FindAncestor}}" 
               Style="{StaticResource TbKey}" /> 
           </DataTemplate> 
          </GridViewColumn.CellTemplate> 
         </GridViewColumn> 
         <GridViewColumn Header="Thu" Width="45"> 
          <GridViewColumn.CellTemplate> 
           <DataTemplate> 
            <TextBlock DataContext="{Binding Thu, Mode=TwoWay}" Text="{Binding Name}" Width="{Binding View.Columns[1].Width, RelativeSource={RelativeSource AncestorType=ListView, Mode=FindAncestor}}" 
               Style="{StaticResource TbKey}" /> 
           </DataTemplate> 
          </GridViewColumn.CellTemplate> 
         </GridViewColumn> 
         <GridViewColumn Header="Fri" Width="45"> 
          <GridViewColumn.CellTemplate> 
           <DataTemplate> 
            <TextBlock DataContext="{Binding Fri, Mode=TwoWay}" Text="{Binding Name}" Width="{Binding View.Columns[1].Width, RelativeSource={RelativeSource AncestorType=ListView, Mode=FindAncestor}}" 
               Style="{StaticResource TbKey}" /> 
           </DataTemplate> 
          </GridViewColumn.CellTemplate> 
         </GridViewColumn> 
        </GridView.Columns> 
       </GridView> 
      </ListView.View> 
     </ListView> 
     <DataGrid IsReadOnly="True" AutoGenerateColumns="False" ItemsSource="{Binding AppointmentData}" Grid.Column="1" HorizontalAlignment="Stretch" Margin="13,243,0,0" VerticalAlignment="Top" > 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Worskhop" Binding="{Binding Workshop}" Width="*"/> 
       <DataGridTextColumn Header="Mon" Binding="{Binding Mon.Name}" Width="*"/> 
       <DataGridTextColumn Header="Tue" Binding="{Binding Tue.Name}" Width="*"/> 
       <DataGridTextColumn Header="Wed" Binding="{Binding Wed.Name}" Width="*"/> 
       <DataGridTextColumn Header="Thu" Binding="{Binding Thu.Name}" Width="*"/> 
       <DataGridTextColumn Header="Fri" Binding="{Binding Fri.Name}" Width="*"/> 
      </DataGrid.Columns> 
     </DataGrid> 
     <TextBlock Grid.Column="1" HorizontalAlignment="Left" Margin="13,222,0,0" TextWrapping="Wrap" Text="Real time display of workshop schedules" VerticalAlignment="Top" Width="325"/> 
     <TextBlock Grid.Column="1" HorizontalAlignment="Left" Margin="13,10,0,0" TextWrapping="Wrap" Text="Right Click to remove appointment" VerticalAlignment="Top" Width="325"/> 
    </Grid> 
</Window> 

Window1.xaml.cs

using System.Collections.ObjectModel; 
using System.ComponentModel; 
using System.Linq; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Input; 

namespace WpfStackOverflow.MyDragDrop 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     ViewModel vm = new ViewModel(); 
     public Window1() 
     { 
      InitializeComponent(); 
      this.DataContext = vm; 
     } 

     #region WeekDay 
      private void WeekDay_DragEnter(object sender, DragEventArgs e) 
      { 
       if (e.Data.GetDataPresent(DataFormats.Text)) 
        e.Effects = DragDropEffects.Copy; 
      } 
      private void WeekDay_Drop(object sender, DragEventArgs e) 
      { 
       ((TextBlock)sender).DataContext = e.Data.GetData(e.Data.GetFormats()[0]); 
      } 
      private void WeekDay_MouseRightButtonDown(object sender, MouseButtonEventArgs e) 
      { 
       (sender as TextBlock).DataContext = null; 
      } 
     #endregion 

     #region Teacher 
      private void Teacher_LeftButtonDown(object sender, MouseButtonEventArgs e) 
      { 
       TextBlock tb = (TextBlock)sender; 
       DragDrop.DoDragDrop(tb, tb.DataContext, DragDropEffects.Copy | DragDropEffects.Move); 
      } 
      private void Teacher_DragEnter(object sender, DragEventArgs e) 
      { 
       if (e.Data.GetDataPresent(DataFormats.Serializable)) 
        e.Effects = DragDropEffects.Copy; 
      } 
     #endregion    
    } 

    public class ViewModel : INotifyPropertyChanged 
    { 
     ObservableCollection<AppointmentRecord> _records = new ObservableCollection<AppointmentRecord>(); 
     public ObservableCollection<AppointmentRecord> AppointmentData { get { return _records; } } 

     ObservableCollection<TeacherRecord> _teacherRecords = new ObservableCollection<TeacherRecord>(); 
     public ObservableCollection<TeacherRecord> TeacherData { get { return _teacherRecords; } } 

     public ViewModel() 
     { 
      TeacherRecord trecord1 = new TeacherRecord() { Name = "A" }; 
      TeacherRecord trecord2 = new TeacherRecord() { Name = "B" }; 
      TeacherRecord trecord3 = new TeacherRecord() { Name = "C" }; 
      TeacherData.Add(trecord1); 
      TeacherData.Add(trecord2); 
      TeacherData.Add(trecord3); 

      AppointmentRecord record1 = new AppointmentRecord() { Workshop = "WS-1", Mon = TeacherData.FirstOrDefault((t) => { return t.Name == "A"; }), Tue = null }; 
      AppointmentRecord record2 = new AppointmentRecord() { Workshop = "WS-2", Mon = null, Tue = TeacherData.FirstOrDefault((t) => { return t.Name == "C"; }) }; 
      AppointmentRecord record3 = new AppointmentRecord() { Workshop = "WS-3", Mon = null, Tue = null, Wed = TeacherData.FirstOrDefault((t) => { return t.Name == "C"; }) };    
      AppointmentData.Add(record1);    
      AppointmentData.Add(record2); 
      AppointmentData.Add(record3); 
     } 

     public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
     public void OnPropertyChanged(string prop) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(prop)); 
     } 
    }  

    public class TeacherRecord 
    { 
     public string Name { get; set; } 
    } 

    public class AppointmentRecord : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
     public void OnPropertyChanged(string prop) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(prop)); 
     } 

     string _workshop; 
     public string Workshop 
     { 
      get { return _workshop; } 
      set 
      { 
       if (_workshop != value) 
       { 
        _workshop = value; 
        OnPropertyChanged("Workshop"); 
       } 
      } 
     } 

     TeacherRecord _mon; 
     public TeacherRecord Mon 
     { 
      get { return _mon; } 
      set 
      { 
       if (_mon != value) 
       { 
        _mon = value; 
        OnPropertyChanged("Mon"); 
       } 
      } 
     } 

     TeacherRecord _tue; 
     public TeacherRecord Tue 
     { 
      get { return _tue; } 
      set 
      { 
       if (_tue != value) 
       { 
        _tue = value; 
        OnPropertyChanged("Tue"); 
       } 
      } 
     } 

     TeacherRecord _wed; 
     public TeacherRecord Wed 
     { 
      get { return _wed; } 
      set 
      { 
       if (_wed != value) 
       { 
        _wed = value; 
        OnPropertyChanged("Wed"); 
       } 
      } 
     } 

     TeacherRecord _thu; 
     public TeacherRecord Thu 
     { 
      get { return _thu; } 
      set 
      { 
       if (_thu != value) 
       { 
        _thu = value; 
        OnPropertyChanged("Thu"); 
       } 
      } 
     } 

     TeacherRecord _fri; 
     public TeacherRecord Fri 
     { 
      get { return _fri; } 
      set 
      { 
       if (_fri != value) 
       { 
        _fri = value; 
        OnPropertyChanged("Fri"); 
       } 
      } 
     } 
    } 
} 
0

ありがとう! 私はそれを私のアプリケーションに実装しました。残念ながら、別の問題があります。
私のデータが取得され、データベースに格納されているので、私は2つの変数を追加しました:
- クラスAppointmentRecord(最初の列にint型iWorkShopId - int型iTeacherIdクラスTeacherRecord(教師のリストビューの幅0の最初の列)に、そして
をAppointmentData-Listviewで幅0)
したがって、先生の名前の横に、WeekDay_Dropのe.Dataにも彼のIDが含まれています。 しかし、データベースのTab_Workshopに予定を保存するために、対応するワークショップIDを取得するにはどうすればいいですか? (先生の名前とIDは別のデータベーステーブルのTab_Teacherにあります。)

+0

答えがあなたの問題を解決する場合は、それを正解としてマークしてください。別の問題については別の質問をしてください。私にあなたの質問を見せたいなら、あなたの質問のコメントに@AnjumSKhanと言います。それは私に通知します。 – AnjumSKhan

+0

申し訳ありません、今すぐ入手しました!もちろん、クラス "AppointmentRecord"は必要な情報をすべて提供します! – Kenmare

+0

私の答えがuを助けた場合は、小さな右のマークを使用して私の答えを正しい答えとしてマークしてください。 – AnjumSKhan

関連する問題