代码之家  ›  专栏  ›  技术社区  ›  yoav.str

WPF我的用户界面不会重新组合

  •  0
  • yoav.str  · 技术社区  · 16 年前

    我的XML是:

    <Window.Resources>
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </Style>
    </Window.Resources>
    
    
    <Grid  >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="381*" />
            <ColumnDefinition Width="20*" />
            <ColumnDefinition Width="101*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="110*" />
            <RowDefinition Height="201*" />
        </Grid.RowDefinitions>
        <StackPanel Margin="320,0,0,0" Grid.RowSpan="2">
            <ListView ItemsSource="{Binding employeeCollection}">
                <ListView.View>
                    <GridView>
    
                        <GridViewColumn Header="Employee ID" DisplayMemberBinding="{Binding Path=EmployeeID}"/>
                        <GridViewColumn Header="First Name" DisplayMemberBinding="{Binding Path=FirstName}"/>
                        <GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding Path=LastName}"/>
                        <GridViewColumn Header="start" DisplayMemberBinding="{Binding Path=startHR}"/>
                        <GridViewColumn Header="finish" DisplayMemberBinding="{Binding Path=finishHR}">
    
                    </GridViewColumn>
                </GridView>
        </ListView.View>
    
            </ListView>
        </StackPanel>
                <StackPanel Margin="2,0,0,137" Grid.RowSpan="2" Grid.ColumnSpan="2" Grid.Column="1">
            <ListBox FontFamily="Guttman Yad-Brush" BorderBrush="AliceBlue" BorderThickness="5" ItemsSource="{Binding Path=dateItems}" DisplayMemberPath="Name" SelectedValuePath="Name" SelectedValue="{Binding Path=dateItem}" Width="233" Height="164" />
        </StackPanel>
        <Button Click="Button_Click" Width="102" Height="34" Margin="0,98,-1,69" Grid.Row="1" Grid.Column="2" Content="בחר" FontFamily="Guttman Yad-Brush" Background="AliceBlue"></Button>
        <TextBox Name="dateTextBox" Grid.Column="1" Margin="26,152,0,33" Grid.Row="1" FontFamily="Guttman Yad-Brush" Grid.ColumnSpan="2" />
        <Calendar SelectedDate="{Binding Path=SelectedDate}" Height="168" Name="calendar1" Width="182" SelectedDatesChanged="calendar1_SelectedDatesChanged" Margin="66,68,485,115" Grid.RowSpan="2" />
    </Grid>
    

    ---GT; ---GT;

    这是开始窗口类:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.ComponentModel;
    using System.Windows.Data;
    
    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 WpfApplication1
    {
    
    public partial class MainWindow : Window
    {
        ConnectionViewModel vm;
    
        public MainWindow()
    {
        InitializeComponent();
        vm = new ConnectionViewModel();
    
        DataContext = vm;
    }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            //((ConnectionViewModel)DataContext).dateItems = "test";
            if (vm.cm.dateItem.ToString() != null)
            {
                dateTextBox.Text = vm.cm.dateItem.ToString();
                vm.em.insert();
            }
        }
    
        private void calendar1_SelectedDatesChanged(object sender, SelectionChangedEventArgs e)
        {
    
                string []s = calendar1.SelectedDate.ToString().Split(' ');
                dateTextBox.Text = s[0];
        }
    
     }
    
    public class ConnectionViewModel
    {
    
        public DateConectionModule cm;
        public employeesGrid em;
    
        public ConnectionViewModel()
        {
    
            cm = new DateConectionModule();
            em = new employeesGrid();
    
        }
    
        public CollectionView dateItems
        {
            get { return cm.dateItems; }
        }
        public string dateItem
        {
            get {return cm.dateItem;} 
            set{ cm.dateItem = value;}
        }
        public CollectionView employeeCollection
        {
            get { return em.employeeCollection; }
        }
    
    
    
    }
    
    
    
    
    public class DateConectionModule : INotifyPropertyChanged
    {
    
        public static string[] datesString = { "01.01.2011", "02.01.2011", "03.01.2011", "04.01.2011", "05.01.2011" };
    
        public DateConectionModule()
        {
    
            employeesGrid em = new employeesGrid();
            IList<dateItem> list = new List<dateItem>();
            //query to database should be here
            foreach (string dataString in datesString)
            {
                list.Add(new dateItem(dataString));
            }
            _dateItemList = new CollectionView(list);
        }
        private readonly CollectionView _dateItemList;
        private string m_dateItem;
    
        public CollectionView dateItems
        {
            get { return _dateItemList; }
        }
    
        public string dateItem
        {
            get { return m_dateItem; }
            set
            {
                if (m_dateItem == value)
                    return;
                m_dateItem = value;
                OnPropertyChanged("dateItem");
            }
        }
        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }
    
    
    
    
    
    public class dateItem
    {
        public string Name { get; set; }
        public dateItem(string name)
        {
            Name = name;
        }
    }
    
    public class employeesGrid : INotifyPropertyChanged
    {
        private CollectionView _dateItemList;
        private string m_dateItem;
    
    
        public employeesGrid()
        {
            IList<employiesData> list = new List<employiesData>();
            //query to database should be here
            list.Add(new employiesData{
            EmployeeID =  "036854768",
            FirstName = "yoav" ,
            LastName = "stern",
            startHR = "1600" ,
            finishHR = "0200"});
            _dateItemList = new CollectionView(list);
        }
    
        public void insert()
        {
            IList<employiesData> list = new List<employiesData>();
            //query to database should be here
            list.Add(new employiesData
            {
                EmployeeID = "0234235345",
                FirstName = "shoki",
                LastName = "zikri",
                startHR = "1600",
                finishHR = "0200"
            });
            _dateItemList = new CollectionView(list);
            OnPropertyChanged("employeeCollection");
        }
    
        public CollectionView employeeCollection
        {
            get { return _dateItemList; }
    
            set
            {
                if (_dateItemList == value) 
                    return;
                _dateItemList = value;
                OnPropertyChanged("employeeCollection");
            }
        }
        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
        public event PropertyChangedEventHandler PropertyChanged;
    
    }
    public class employiesData
    {
        public string EmployeeID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string startHR { get; set; }
        public string finishHR { get; set; }
    }
    

    }

    1.调用inserttest时,用户界面将加载我的新值。

    2.这是我的第一个WPF工作,所以任何关于如何使事情更易读、更省力、更简单的建议,以及关于我的糟糕架构的注释,我知道它很粗糙,可以

    1 回复  |  直到 16 年前
        1
  •  1
  •   TalentTuner    16 年前

    低于我的观点

    1-ConnectionViewModel类的用途是什么,它只是扭曲DataConnectionViewModel,所以我建议您可以去掉ConnectionViewModel()并使用DataConnectionViewModel。

    2-我认为您可以去掉EmployeesGrid类,因为您只需要一个雇员集合,所以不要使用单独的集合类,而是在DataConnectionViewModel()类中进行ObservrableCollection。

    3-使用wpf-model-view view model模板,这样可以提供更好的想法

    4-我刚刚重新编译了您的代码,创建了一个类似的应用程序,它使用MVVM和ObservableCollection,而且使用起来更简单。

    我的XAML

    <Window.Resources>
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
        </Style>
    </Window.Resources>
    
    
    <Grid  >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="381*" />
            <ColumnDefinition Width="20*" />
            <ColumnDefinition Width="101*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="110*" />
            <RowDefinition Height="201*" />
        </Grid.RowDefinitions>
        <StackPanel Margin="320,0,0,0" Grid.RowSpan="2">
            <ListView ItemsSource="{Binding EmpList}">
                <ListView.View>
                    <GridView>
    
                        <GridViewColumn Header="Employee ID" DisplayMemberBinding="{Binding Path=EmployeeID}"/>
                        <GridViewColumn Header="First Name" DisplayMemberBinding="{Binding Path=FirstName}"/>
                        <GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding Path=LastName}"/>
                        <GridViewColumn Header="start" DisplayMemberBinding="{Binding Path=startHR}"/>
                        <GridViewColumn Header="finish" DisplayMemberBinding="{Binding Path=finishHR}">
    
                        </GridViewColumn>
                    </GridView>
                </ListView.View>
    
            </ListView>
        </StackPanel>
        <StackPanel Margin="2,0,0,137" Grid.RowSpan="2" Grid.ColumnSpan="2" Grid.Column="1">
            <ListBox FontFamily="Guttman Yad-Brush" BorderBrush="AliceBlue" BorderThickness="5" ItemsSource="{Binding Path=dateItems}" DisplayMemberPath="Name" SelectedValuePath="Name" SelectedValue="{Binding Path=dateItem}" Width="233" Height="164" />
        </StackPanel>
        <!--<Button Click="Button_Click" Width="102" Height="34" Margin="0,98,-1,69" Grid.Row="1" Grid.Column="2" Content="בחר" FontFamily="Guttman Yad-Brush" Background="AliceBlue"></Button>-->
        <TextBox Name="dateTextBox" Grid.Column="1" Margin="26,152,0,33" Grid.Row="1" FontFamily="Guttman Yad-Brush" Grid.ColumnSpan="2" />
        <!--<Calendar SelectedDate="{Binding Path=SelectedDate}" Height="168" Name="calendar1" Width="182" SelectedDatesChanged="calendar1_SelectedDatesChanged" Margin="66,68,485,115" Grid.RowSpan="2" />-->
    </Grid>
    

    我的密码

    1

    创建继承ViewModelBase类的DataConnectionViewModel。

    使用系统; 使用system.collections.generic; 使用system.linq; 使用system.text; 使用employee.models; 使用system.collections.objectmodel;

    命名空间Employee.ViewModels { 公共类日期连接模块:ViewModelBase { #区域“实例变量” public static string[]datessstring=“01.01.2011”,“02.01.2011”,“03.01.2011”,“04.01.2011”,“05.01.2011” #endregion“实例变量”

        #region " Constructor "
    
        public DateConectionModule()
        {
            CreateEmployeeData();
        }
        #endregion " Constructor "
    
    
        #region " Public Properties "
    
        public ObservableCollection<EmployeeData> EmpList { get; set; }
    
    
    
        #endregion " Public Properties "
    
    
        #region " Helper Methods "
    
        private void CreateEmployeeData()
        {
            EmpList = new ObservableCollection<EmployeeData>();
            EmpList.Add
                (
                 new EmployeeData() {  EmployeeID="1", LastName="Gates", FirstName="Bill", finishHR="", startHR =""  }
                );
    
        }
    
        #endregion " Helper Methods "
    
    
    
    
    } 
    

    }

    2-ViewModelBase类

    使用系统; 使用system.collections.generic; 使用system.componentmodel; 使用system.linq; 使用system.text; 使用system.windows; 使用system.windows.input;

    命名空间Employee.ViewModels { // ///为ViewModel类提供通用功能 // 公共抽象类ViewModelBase:InotifyPropertyChanged { 公共事件propertychangedeventhandler propertychanged;

        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
    
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    
    }
    

    }

    3-在mainwindow.xaml.cs中设置数据上下文

    公共分部类主视图:窗口 { 公共主视图() { 初始化组件();

            this.DataContext = new DateConectionModule();
        }
    }
    

    还有很多其他的事情,比如依赖注入等。但是对于您的情况,您可以编写一个控制器,它调用您的DataService来给您提供就业列表,而不是将列表分配给ObservableCollection。

    4-我可以建议您阅读Abot Prism框架,它在应用程序管理和TDD中提供了很大的灵活性。

    推荐文章