wpf мой интерфейс не обновляется - PullRequest
0 голосов
/ 22 августа 2010

мой 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>

-> ->

это класс стартового окна:

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 Ответ

1 голос
/ 22 августа 2010

Под моими точками

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

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

3- Используйте Wpf-модель -Шаблон View-ViewModel, который дает вам лучшее представление

4 - я просто перекрасил ваш код и создал аналогичное приложение, которое использует MVVM и ObservableCollection и намного проще в использовании.

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>

Мой код

1-

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

using System;using System.Collections.Generic;использование System.Linq;используя System.Text;использование Employee.Models;using System.Collections.ObjectModel;

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

using System;using System.Collections.Generic;using System.ComponentModel;использование System.Linq;используя System.Text;используя System.Windows;using 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: Window {public MainView () {InitializeComponent ();

        this.DataContext = new DateConectionModule();
    }
}

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

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

...