首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF ListView下拉列表获取单元格

WPF ListView下拉列表获取单元格
EN

Stack Overflow用户
提问于 2016-10-01 16:10:13
回答 2查看 337关注 0票数 0

我正在尝试创建一个WPF对话来配置车间时间表。在左边有一个列表视图,其中有一个列作为教师的名字。右边是一个列表视图,有六列,一列用于研讨会,其余五列用于周一至周五的日子。

=

代码语言:javascript
复制
A             WS-1           A   B
B             WS-2       C
C             WS-3                          B

用户应该通过拖放来配置时间表,例如C老师在周一讲授WS-2工作坊。

在WinForms中,获得drop单元是一项简单的工作,但我在WPF中找不到这种方法。

以下是xaml代码的一部分。

代码语言:javascript
复制
<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> 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-03 10:54:36

DragDrop HowTo

“挑战者”计划确定在DragDrop.DoDragDrop()中应该使用哪种属性。由于我们有不同的ListView,所以使用Teacher实体本身将是有意义的。我使用Teacher从左侧ListView获得源TextBlock.DataContext。并将其设置为DataContext of Drop target TextBlock

问题是,DataContext要使用哪个DataFormats值,所以我使用了IDataObject.GetFormats()

输出:

请参阅下面的示例应用程序。你可以简单地复制/粘贴。

Window1.xaml

代码语言:javascript
复制
<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

代码语言:javascript
复制
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");
                }
            }
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2016-10-06 13:43:10

感谢AnjumSKhan给出的好答案!我已经在我的应用程序中实现了它,它运行得很好。不幸的是,我又遇到了一个问题。

因为我的数据被检索并存储在数据库中,所以我添加了两个变量:

  • int iTeacherId到类TeacherRecord (教师列表视图中宽度为0的第一列),以及
  • int iWorkShopId到类AppointmentRecord (AppointmentData-Listview中宽度为0的第一列) 因此,除了老师的名字,e.Data in WeekDay_Drop现在也包含他的Id。但是,如何获得相应的车间Id,以便将约会保存在数据库中的Tab_Workshop中。(教师的姓名和Id在Tab_Teacher中,这是一个不同的数据库表。)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39808761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档