2010-08-22 2 views
0

мой XML является:МОФ мой UI оленья кожа refrash

<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> 

-> ->

это класс запуска окна:

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 называется UI будет загружать мои новые значения

2.это моя первой работа МОФА поэтому любые советы о том, как сделать вещи более удобными для чтения, effican, простых и заметки о моей бедной архитектуре я знаю, что это креповый может некоторые

+0

Дайте более подробную информацию. Как вы связываете (?) Эту коллекцию в интерфейсе? –

+0

@victor Я надеюсь, что редактирование, которое я сделал, поможет вам, а не info перегрузить в редакцию, что я просто хочу знать, есть ли лучшее впечатление, которое вы могли бы предложить по моей плохой архитектуре, моему моему первому приложению wpf и мне нужны советы. –

ответ

1

Ниже моей точки

1- что такое использование класса ConnectionViewModel, это просто warpping DataConnectionViewModel, так что я хотел бы предложить, что вы можете избавиться от ConnectionViewModel () и используйте DataConnectionViewModel.

2-я думаю, что вы можете избавиться от класса employeeGrid, потому что все, что вам нужно для сбора сотрудников, а не для использования отдельного класса коллекции, сделайте наблюдательный коллектив в классе DataConnectionViewModel().

3- Использование Wpf- Модель -View-ViewModel шаблон это дает лучшее представление

4- я только refacror свой код и создать подобное приложение, которое использует 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-

Создать DataConnectionViewModel, который наследует класс ViewModelBase.

с использованием системы; с использованием System.Collections.Generic; с использованием System.Linq; с использованием System.Text; с использованием Employee.Models; с использованием System.Collections.ObjectModel;

пространства имен Employee.ViewModels { общественного класса DateConectionModule: ViewModelBase { #region "Переменные экземпляра" общественности статической строки [] datesString = { "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

общественного частичного класса MainView: Окно { общественного MainView() { InitializeComponent();

 this.DataContext = new DateConectionModule(); 
    } 
} 

Есть много других вещей, как Dependency Injection, и т.д .. но для случая, вы можете написать контроллер, который называют свой DataService, чтобы дать вам список employess, чем назначить список к ObservableCollection.

4- я могу предложить считывать abot Prism framework, который дает вам большую гибкость при управлении приложениями, а также в TDD.

+0

да, я думаю, что точка - это сама конструкция, которую я просто не знаю, как бы, я был бы очень доволен, если бы вы могли рекомендовать артистическую программу, где даны экзамены. –

Смежные вопросы