Проблемы с выпадающим списком WPF и списком - PullRequest
2 голосов
/ 13 июля 2011

Мне нужна помощь с заданием, которое доставляет мне трудности.Используются WPF и C #.

  1. Как обновлять подпункт каждую минуту?

  2. Как извлечь строку выбранного выпадающего списка и добавить ее к подпункту в просмотре списка?

  3. Мне нужно использовать диспетчер задачиногда закрывать свое приложение, я не знаю почему?

Вот часть кода, который у меня есть, и изображение того, как оно должно выглядеть.

Application

Основной графический интерфейс

    namespace Assignment_3
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public int time=0;
    public MainWindow()
    {
        InitializeComponent();
        UpdateGUI();
    }


    public void UpdateGUI()
    {

        DispatcherTimer dispatchTimer = new DispatcherTimer();
        dispatchTimer.Tick += new EventHandler(dispatchTimer_Tick);
        dispatchTimer.Interval = new TimeSpan(0,0,1);
        dispatchTimer.Start();
    }

    public void dispatchTimer_Tick(object sender, EventArgs e)
    {

        //    lvFlights.Items.Add(DateTime.Now.Hour.ToString() + ":" + DateTime.Now.Second.ToString());
       // lvFlights.Items.Add(new { FlightCode = txtFlightCode.Text, Status = "sent to runaway", Time = DateTime.Now.Millisecond.ToString() });// lvFlights.Items.Count });
        time ++;

       // txtFlightCode.Text = (Convert.ToString(time));
        CommandManager.InvalidateRequerySuggested();
        lvFlights.Items.MoveCurrentToLast();
        lvFlights.SelectedItem = lvFlights.Items.CurrentItem;
        lvFlights.ScrollIntoView(lvFlights.Items.CurrentItem);

    }

    public void button1_Click(object sender, RoutedEventArgs e)
    {

        Flight flight = new Flight();
        lvFlights.Items.Add(new { FlightCode = txtFlightCode.Text, Status = "    sent to runway", Time = time +" minutes ago"});
        Sort("Time", ListSortDirection.Descending);

        flight.Title = "Flight " + txtFlightCode.Text;

        flight.TakeOffEvent += new Flight.TakeOffHandler(PrintOutTakeOff);
        flight.ChangeEvent += new Flight.ChangeHandler(PrintOutChange);
        flight.LandEvent+=new Flight.LandHandler(PrintOutLand);

        try
        {
            flight.Show();
        }
        catch { MessageBox.Show("damn, u can't program"); }
    }

    public void PrintOutTakeOff(object source, TakeOffEventArgs e)
    {
        lvFlights.Items.Add(new { FlightCode = txtFlightCode.Text, Status = e.Status, Time = e.Time });
        Sort("Time", ListSortDirection.Descending);
    }
    public void PrintOutChange(object source, ChangeRouteEventArgs e)
    {
        lvFlights.Items.Add(new { FlightCode = txtFlightCode.Text, Status = e.Status, Time = e.Time });
        Sort("Time", ListSortDirection.Descending);
    }

    public void PrintOutLand(object source, LandEventArgs e)
    {
        lvFlights.Items.Add(new { FlightCode = txtFlightCode.Text, Status = e.Status, Time = e.Time });
        Sort("Time", ListSortDirection.Descending);
    }

    private void Sort(string sortBy,ListSortDirection direction)
    {
        //The MSDNversionpass ItemsSource property
        ICollectionView dataView=CollectionViewSource.GetDefaultView(lvFlights.Items);

        dataView.SortDescriptions.Clear();
        SortDescription sd =new SortDescription(sortBy, direction);
        dataView.SortDescriptions.Add(sd);
        dataView.Refresh();
    }
}
}

Flight GUI

namespace Assignment_3
{
/// <summary>
/// Interaction logic for Flight.xaml
/// </summary>
public partial class Flight : Window
{
  public   delegate void TakeOffHandler(object source, TakeOffEventArgs e);
   public  delegate void ChangeHandler(object source, ChangeRouteEventArgs e);
   public delegate void LandHandler(object source, LandEventArgs e);

   public  event TakeOffHandler TakeOffEvent;
   public  event ChangeHandler ChangeEvent;
   public event LandHandler LandEvent;



    public Flight()
    {
        InitializeComponent();

        cmbStatus.IsEnabled = false;
        btnLand.IsEnabled = false;
    //    image1.Source = global::Assignment_3.Properties.Resources.airplane2;

    }

    private void btnStart_Click(object sender, RoutedEventArgs e)
    {
        cmbStatus.IsEnabled = true;
        btnLand.IsEnabled = true;
        btnStart.IsEnabled = false;

        try
        {
            TakeOffEvent(this, new TakeOffEventArgs("{0}", "{1}",     DateTime.Now.ToString()));

        }
        catch { MessageBox.Show("lern 2 progrm"); }
     //   MainWindow main = new MainWindow();
   //   main.lvFlights.Items.Add(this.Title + "    sent to runway" + "   1 minute ago");

    }



    private void btnLand_Click(object sender, RoutedEventArgs e)
    {
        LandEvent(this, new LandEventArgs("aa", "bb", "cc"));
    }

    public void cmbStatus_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

        string route;  
      switch (cmbStatus.SelectedIndex)
        {
            case 0: route = "10 deg"; ChangeEvent(this, new ChangeRouteEventArgs("aa", "bb", "cc"));
                break;
            case 1: route = "30 deg"; ChangeEvent(this, new ChangeRouteEventArgs("aa", "bb", "cc"));
                break;
            case 2: route = "60 deg"; ChangeEvent(this, new ChangeRouteEventArgs("aa", "bb", "cc"));
                break;
            case 3: route = "90 deg"; ChangeEvent(this, new ChangeRouteEventArgs("aa", "bb", "cc"));
                break;
      }
    }

    }
}

Изменить класс маршрута, вот где у меня возникают проблемы с получением выбранного элементаиз выпадающего списка и попадания в список

namespace Assignment_3
{
public class ChangeRouteEventArgs
{
    public string FlightCode;
    public string Status;
    public string Time;
    Flight flight =new Flight();


    public ChangeRouteEventArgs(string FlightCode, string Satus, string Time)
    {
        // TODO: Complete member initialization
        switch (flight.cmbStatus.SelectedIndex)
        {
            case 0: this.Status = "    now heading "+"10 deg";
                break;
            case 1: this.Status = "    now heading " + "30 deg";
                break;
            case 2: this.Status = "    now heading " + "60 deg";
                break;
            case 3: this.Status = "    now heading " + "90 deg";
                break;

        }

        this.FlightCode = "dis reelee werkt";
        this.Status = "    now heading " + flight;
        this.Time = "   "+DateTime.Now.Minute.ToString();
    }
}
}

Буду крайне признателен за вашу помощь!=)

Редактировать:

Ну, я полагаю, вы хотите, чтобы я показал вам мои коды xaml?

<Window x:Class="Assignment_3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Control Tower" Height="276" Width="407" ResizeMode="NoResize" ShowInTaskbar="True" WindowStyle="ThreeDBorderWindow">
    <Grid>
        <ListView Height="170" HorizontalAlignment="Left" Margin="12,12,0,0" Name="lvFlights" VerticalAlignment="Top" Width="373">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Flight Code" Width="90" DisplayMemberBinding="{Binding FlightCode}"/>
                    <GridViewColumn Header="Status" Width="160" DisplayMemberBinding="{Binding Status}"/>
                    <GridViewColumn Header="Time" Width="120" DisplayMemberBinding="{Binding Time}"/>
                </GridView>
            </ListView.View>
        </ListView>
        <Label Content="Next Flight" Height="28" HorizontalAlignment="Left" Margin="12,197,0,0" Name="label1" VerticalAlignment="Top" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="86,200,0,0" Name="txtFlightCode" VerticalAlignment="Top" Width="88" Text="flight code" />
        <Button Content="Send Next Airplane to Runaway" Height="23" HorizontalAlignment="Right" Margin="0,199,12,0" Name="btnSend" VerticalAlignment="Top" Width="188" Click="button1_Click" />
    </Grid>
</Window>

Flight xaml

<Window x:Class="Assignment_3.Flight"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Flight" Height="244" Width="277" ResizeMode="NoResize" WindowStyle="ToolWindow">
    <Grid>
        <Image Height="159" HorizontalAlignment="Left" Margin="12,12,0,0" Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="231" Source="file:///C:/Users/Hans/Documents/Visual%20Studio%202010/Projects/Assignment%203/Assignment%203/Resources/airplane2.jpg" />
        <Button Content="Start" Height="23" HorizontalAlignment="Left" Margin="12,177,0,0" Name="btnStart" VerticalAlignment="Top" Width="60" Click="btnStart_Click" />
        <Button Content="Land" Height="23" HorizontalAlignment="Right" Margin="0,177,12,0" Name="btnLand" VerticalAlignment="Top" Width="60" Click="btnLand_Click" />
        <ComboBox Height="23" HorizontalAlignment="Left" Margin="78,177,0,0" Name="cmbStatus" VerticalAlignment="Top" Width="99"  SelectedIndex="-1" SelectionChanged="cmbStatus_SelectionChanged" SelectedItem="{Binding Item}">

            <ComboBoxItem Content="10 deg" />
            <ComboBoxItem Content="30 deg" />
            <ComboBoxItem Content="60 deg" />
            <ComboBoxItem Content="90 deg" />
        </ComboBox>
    </Grid>
</Window>

Так что мне теперь делать?= / Я плохо в этом.

Ответы [ 2 ]

3 голосов
/ 13 июля 2011

Ваш код действительно грязный и плохо написан.Будучи приложением WPF, вы должны учитывать и код XAML.

То, что вы собираетесь сделать, довольно просто, но использование «старого стиля программирования» станет кошмаром, с множеством неприятностей инестабильность.Я настоятельно рекомендую подход MVVM, который может быть сложным на первый взгляд, но он дает отличные результаты.Как только ты научишься, ты больше не уйдёшь.

1 голос
/ 13 июля 2011

, чтобы получить SelectedItem из ComboBox, вы можете использовать простую привязку.

<ComboBox SelectedValue="{Binding Path=MySelectedItemProperty}"
          ItemsSource="{Binding Path=MyItemslistProperty}"/>

EDIT.если вы используете связывание или какой-то другой mvvm, вы можете просто добавить новые элементы в ваш список просмотра, если вам нужно следующее.я называю тип listviewitem TypL

  • , использую ObservableCollection TypL и привязываю его к Itemssource вашего ListView
  • , просто используйте метод Add для добавления новых элементов в вашу коллекцию

образец переплета

<ListView ItemsSource="{Binding Path=MyObservableCollectionProperty}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...