2016-10-01 77 views
0

我正在嘗試創建一個WPF對話框來配置研討會時間表。 左邊有一個列表視圖,其中一列是教師姓名。 在右側有一個六列的列表視圖,其中一列用於研討會, 以及其他五列,分別爲星期一至星期五。WPF ListView刪除獲取單元格

|教師| |工作坊|週一|星期二|星期三|星期四|星期五|

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

用戶應該通過拖放來配置時間表,例如,老師C在週一教授了 研討會WS-2。

在WinForms中,獲取drop cell是一項簡單的工作,但我在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實體本身將是有意義的。我使用TextBlock.DataContext從左側ListView獲取源Teacher。並將其設置爲Drop targetTextBlockDataContext

問題是,其中DataFormats值用於DataContext,所以我用IDataObject.GetFormats()

輸出:

Appointment Schedule Output

請參見下面的示例應用程序。你可以簡單的複製/粘貼。

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

感謝AnjumSKhan的出色答卷! 我已經將它實現到我的應用程序中,並且它工作正常。不幸的是,我還有一個問題。
因爲我的數據被取回並存儲在數據庫中,我添加兩個變量:
- INT iTeacherId類TeacherRecord(在老師的列表視圖與寬度0第一列),和
- INT iWorkShopId類AppointmentRecord(第一列在AppointmentData-Listview中的寬度爲0)
因此,除了老師的姓名之外,WeekDay_Drop中的e.Data現在還包含他的Id。 但是,如何獲取相應的研討會ID以便在數據庫中的Tab_Workshop中保存預約。 (教師姓名和ID在Tab_Teacher中,是一個不同的數據庫表。)

+0

如果答案解決了您的問題,請將其標記爲正確答案。並針對不同的問題單獨提出問題。如果您想讓我看看您的問題,請在您的問題評論中提及我爲@AnjumSKhan,並通知我。 – AnjumSKhan

+0

對不起,現在我明白了!當然,「AppointmentRecord」類提供了所有需要的信息! – Kenmare

+0

如果我的回答對你有幫助,請用正確的小標記將我的答案標記爲正確答案。 – AnjumSKhan