珂珂的个人博客 - 一个程序猿的个人网站

WPF的MVVM实例(四)-列表页

[原]WPF的MVVM实例(一)

[原]WPF的MVVM实例(二)-ViewModel基类

[原]WPF的MVVM实例(三)-ViewModel实现类

[原]WPF的MVVM实例(四)-列表页

[原]WPF的MVVM实例(五)-编辑页

XAML代码

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<Page x:Class="MyList.UI.RegisterListPage"
      mc:Ignorable="d" 
      xmlns:local="clr-namespace:MyList.UI"
      xmlns:util="clr-namespace:MyList.UI.Util"
      xmlns:pager="clr-namespace:FYJ.Winui.Pager;assembly=FYJ.Winui.Pager"
      d:DesignHeight="300" d:DesignWidth="600"
    Title="RegisterListPage">
 
    <Page.Resources>
        <util:DatetimeConvert x:Key="datetimeConvert"></util:DatetimeConvert>
    </Page.Resources>
 
    <Grid>
        <Grid.RowDefinitions>
            <!--2个0高度屏蔽掉查询和分页-->
            <RowDefinition Height="50"/>
            <RowDefinition Height="0"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="0"/>
        </Grid.RowDefinitions>
 
        <DockPanel Grid.Row="0">
            <local:ToolBarUserControl x:Name="toolBarControl1"></local:ToolBarUserControl>
        </DockPanel>
 
        <WrapPanel Grid.Row="1" Margin="0,5,5,0">
            <TextBlock Text="关键字" Margin="5,0,0,0" VerticalAlignment="Center"></TextBlock>
            <TextBox Width="100" Margin="5,0,0,0" Height="24" VerticalAlignment="Center" x:Name="txtQuery"></TextBox>
            <TextBlock Text="日期始" Margin="5,0,0,0" VerticalAlignment="Center"></TextBlock>
            <DatePicker Margin="5,0,0,0" Width="100" VerticalAlignment="Center" x:Name="dateStart"></DatePicker>
            <TextBlock Text="日期终" Margin="5,0,0,0" VerticalAlignment="Center"></TextBlock>
            <DatePicker Margin="5,0,0,0" Width="100" VerticalAlignment="Center" x:Name="dateEnd"></DatePicker>
            <Button Content="查询" Margin="5,0,0,0" VerticalAlignment="Center" Click="Search_Click"></Button>
        </WrapPanel>
        <DataGrid  Grid.Row="2" x:Name="dataGrid1" AutoGenerateColumns="False" IsReadOnly="True"  AlternationCount="2" ItemsSource="{Binding QueryData}"  util:SelectedItemsBehavior.SelectedItemsChangedHandler="{Binding DeleteCommand}">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Path=registerUrlName}" ClipboardContentBinding="{x:Null}" Header="网站名称"/>
                <DataGridHyperlinkColumn Binding="{Binding Path=registerUrl}" ClipboardContentBinding="{x:Null}" Header="网址"/>
                <DataGridTextColumn Binding="{Binding Path=registerUserName}" ClipboardContentBinding="{x:Null}" Header="用户名"/>
                <DataGridTextColumn Binding="{Binding Path=registerEmail}" ClipboardContentBinding="{x:Null}" Header="邮箱"/>
                <DataGridTextColumn Binding="{Binding Path=bindTel}" ClipboardContentBinding="{x:Null}" Header="绑定电话"/>
                <DataGridTextColumn Binding="{Binding Path=bindQQ}" ClipboardContentBinding="{x:Null}" Header="绑定QQ"/>
                <DataGridTextColumn Binding="{Binding Path=bindWeibo}" ClipboardContentBinding="{x:Null}" Header="绑定微博"/>
                <DataGridTextColumn Binding="{Binding Path=ADD_DATE,Converter={StaticResource datetimeConvert}}" ClipboardContentBinding="{x:Null}" Header="添加时间"/>
                <DataGridTextColumn Binding="{Binding Path=UPDATE_DATE,Converter={StaticResource datetimeConvert}}" ClipboardContentBinding="{x:Null}" Header="修改时间"/>
            </DataGrid.Columns>
 
            <DataGrid.RowStyle>
                <Style TargetType="{x:Type DataGridRow}">
                    <Style.Triggers>
                        <Trigger Property="ItemsControl.AlternationIndex" 
                                 Value="0">
                            <Setter Property="Background" Value="#FFF0F0F0" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.RowStyle>
 
            <!-- 必须设置CellStyle 否则上面的IsSelected不起作用 因为CellStyle会覆盖RowStyle-->
            <DataGrid.CellStyle >
                <Style TargetType="DataGridCell">
                    <Style.Triggers >
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="Background" Value="#FF6B8BE0"></Setter>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.CellStyle>
             
        </DataGrid>
        <local:LoadingWait Grid.Row="2"  x:Name="loading" Visibility="{Binding LoadingVisibility}"></local:LoadingWait>
 
        <DockPanel  Grid.Row="3"  Margin="0,5,0,5" DataContext="{Binding ElementName=dataGrid1,Path=CurrentItem}">
            <pager:PagerUserControl x:Name="pager" Total="{Binding ElementName=dataGrid1,Path=Items.Count}"  PageChanged="pager_PageChanged"></pager:PagerUserControl>
            <!--<TextBox Height="23" TextWrapping="Wrap" Text="{Binding Path=fileName}" MinWidth="200"/>-->
            <!--<TextBlock x:Name="txtTotal" Text="{Binding ElementName=dataGrid1,Path=Items.Count}" VerticalAlignment="Center" ></TextBlock>-->
        </DockPanel>
         
        <Grid.ContextMenu>
            <ContextMenu>
                <MenuItem Header="添加" x:Name="menuAdd">
                    <MenuItem.Icon>
                        <Image Source="Resources/Add.png"></Image>
                    </MenuItem.Icon>
                </MenuItem>
                <MenuItem  Header="修改" x:Name="menuEdit">
                    <MenuItem.Icon>
                        <Image Source="Resources/Edit.png"></Image>
                    </MenuItem.Icon>
                </MenuItem>
                <!--Command="{Binding DeleteCommand}"  CommandParameter="{Binding SelectedItems,ElementName=dataGrid1}"  无法传递参数-->
                <MenuItem  Header="删除" x:Name="menuDelete" Command="{Binding DeleteCommand}">
                    <MenuItem.Icon>
                        <Image Source="Resources/Delete.png"></Image>
                    </MenuItem.Icon>
                </MenuItem>
                <MenuItem  Header="刷新" Command="{Binding QueryCommand}">
                    <MenuItem.Icon>
                        <Image Source="Resources/Refresh.png"></Image>
                    </MenuItem.Icon>
                </MenuItem>
 
                <MenuItem  Header="筛选...">
                </MenuItem>
 
                <MenuItem  Header="查找..." Command="{Binding SearchCommand}">
                    <MenuItem.Icon>
                        <Image Source="Resources/search.png"></Image>
                    </MenuItem.Icon>
                </MenuItem>
                <MenuItem  Header="查找下一个" Command="{Binding SearchNextCommand}">
                </MenuItem>
 
                <MenuItem  Header="导出">
                    <MenuItem.Icon>
                        <Image Source="Resources/export.png"></Image>
                    </MenuItem.Icon>
                    <MenuItem  Header="导出选择..."></MenuItem>
                    <MenuItem  Header="导出当前页..."></MenuItem>
                    <MenuItem  Header="导出全部..."></MenuItem>
                </MenuItem>
 
                <MenuItem  Header="打印...">
                    <MenuItem.Icon>
                        <Image Source="Resources/print.png"></Image>
                    </MenuItem.Icon>
                </MenuItem>
                 
            </ContextMenu>
        </Grid.ContextMenu>
    </Grid>
 
</Page>

当然不是所有按钮和事件都用了MVVM模式  有时候觉得也不用太纠结这个

下面是很少的后台代码

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
using FYJ.Pager;
using MyList.Entity;
using MyList.Model;
using MyList.UI.Util;
using MyList.ViewModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
namespace MyList.UI
{
    /// <summary>
    /// RegisterListPage.xaml 的交互逻辑
    /// </summary>
    public partial class RegisterListPage : Page
    {
        private RegisterViewModel viewModel;
        public RegisterListPage()
        {
            InitializeComponent();
        }
 
        //这个方法比构造函数先执行
        protected async override void OnInitialized(EventArgs e)
        {
            base.OnInitialized(e);
            InitEvents();
            viewModel = new RegisterViewModel(this.Dispatcher);
            viewModel.MdataGrid = this.dataGrid1;
            viewModel.MSearchWindow = new SearchWindow();
            viewModel.LoadedEvent += viewModel_LoadedEvent;
            await InitData();
            this.DataContext = this.viewModel;
        }
 
        void viewModel_LoadedEvent(int total)
        {
            this.pager.Init(total);
        }
 
        //查询数据
        private async Task InitData()
        {
            await Task.Run(() =>
            {
                viewModel.QueryCommand.Execute(null);
            });
        }
 
        //事件
        private void InitEvents()
        {
            ToolBarUserControl uc = this.toolBarControl1;
            Button btnAdd = (Button)uc.FindName("btnAdd");
            Button btnEdit = (Button)uc.FindName("btnEdit");
            btnAdd.Click += Add_Click;
            btnEdit.Click += Edit_Click;
           
            this.menuAdd.Click += Add_Click;
            this.menuEdit.Click += Edit_Click;
        }
 
        private void Add_Click(object sender, RoutedEventArgs e)
        {
            this.viewModel.SaveData = null;
            RegisterEditWindow window = new RegisterEditWindow(this.viewModel);
            window.ShowDialog();
        }
 
        private void Edit_Click(object sender, RoutedEventArgs e)
        {
            object obj = this.dataGrid1.SelectedItem;
            if (obj == null)
            {
                MessageBox.Show("请选择一行数据");
                return;
            }
            if (this.dataGrid1.SelectedItems.Count > 1)
            {
                MessageBox.Show("只能选择一行数据修改");
                return;
            }
 
            this.viewModel.SaveData = new System.Collections.ObjectModel.ObservableCollection<RegisterModel>();
            this.viewModel.SaveData.Add((RegisterModel)obj);
            RegisterEditWindow window = new RegisterEditWindow(this.viewModel);
            window.ShowDialog();
        }
 
        private void Search_Click(object sender, RoutedEventArgs e)
        {
            GridPager pager = new GridPager();
            List<Func<my_tb_register, bool>> wheres = new List<Func<my_tb_register, bool>>();
            if(this.txtQuery.Text.Trim()!="")
            {
                string queryString = this.txtQuery.Text.Trim().ToLower();
                wheres.Add(c=>c.bindQQ.ToLower().Contains(queryString)
                || c.bindTel.ToLower().Contains(queryString)
                ||c.bindWeibo.ToLower().Contains(queryString)
                ||c.registerEmail.ToLower().Contains(queryString)
                ||c.registerUrl.ToLower().Contains(queryString)
                ||c.registerUrlName.ToLower().Contains(queryString)
                ||c.registerUserName.ToLower().Contains(queryString)
                ||c.registerRemark.ToLower().Contains(queryString)
                );
            }
 
            if (this.dateStart.Text.Trim() != "")
            {
                wheres.Add(c=>(c.ADD_DATE >= this.dateStart.DisplayDate)
                    ||(c.UPDATE_DATE >= this.dateStart.DisplayDate));
            }
            if (this.dateEnd.Text.Trim() != "")
            {
                wheres.Add(c => (c.ADD_DATE <= this.dateEnd.DisplayDate)
                    || (c.UPDATE_DATE <= this.dateEnd.DisplayDate));
            }
        }
 
        private void pager_PageChanged(object sender, FYJ.Winui.Pager.PageChangedEventArgs args)
        {
 
        }
    }
}



上一篇:wordpress3.6 修改的地方

下一篇:个人代码全部开源


0 评论

查看所有评论

给个评论吧