views:

46

answers:

1

my xml is :

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

--> -->

this is the start window class :

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.i want thar when insertTest is called the UI will load my new values

2.this is my first wpf work so any advices on how to make things more readable,effican,simple and notes about the my poor architecture i know it's crapy can some

A: 

Hi

Below my points

1- What is the use of ConnectionViewModel class , it is just warpping DataConnectionViewModel so i would suggest that you can get rid of ConnectionViewModel() and use DataConnectionViewModel.

2-i think you can Get rid of employeesGrid class because all you need a collection of employees so rather than useing a seprate collection class, make an observrablecollection in DataConnectionViewModel() class.

3- Use Wpf- Model -View-ViewModel Template this gives you better idea

4- i have just refacror your code and create a similar application which uses MVVM and ObservableCollection and much simpler to use.

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

My Code

1-

Create DataConnectionViewModel which is inheriting ViewModelBase class.

using System; using System.Collections.Generic; using System.Linq; using System.Text; using Employee.Models; using System.Collections.ObjectModel;

namespace Employee.ViewModels { public class DateConectionModule : ViewModelBase { #region " Instance Variables " public static string[] datesString = { "01.01.2011", "02.01.2011", "03.01.2011", "04.01.2011", "05.01.2011" }; #endregion " Instance Variables "

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

using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Windows; using System.Windows.Input;

namespace Employee.ViewModels { /// /// Provides common functionality for ViewModel classes /// public abstract class ViewModelBase : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

}

}

3- Set the Data Context in the MainWindow.Xaml.cs

public partial class MainView : Window { public MainView() { InitializeComponent();

        this.DataContext = new DateConectionModule();
    }
}

there are lot of other things like Dependency Injection, etc.. but for your case , you can write a controller which call your dataservice to give you employess list than assign list to the observablecollection.

4- i can suggest read abot Prism framework which gives you very much flexibility during application management and also in TDD.

saurabh
yes i think the point is the design itself i just dont know how to , i would b very happy if you could recomend on an articale where exampeles are given ..
yoav.str