Как я могу привязать элемент управления ListBox к списку в WPF? - PullRequest
1 голос
/ 06 марта 2011

Я хочу создать двухстороннюю привязку между списком и списком .NET.

В моем графическом интерфейсе у меня есть список, текстовое поле и кнопки добавления и удаления.В списке отображаются автомобили, и моя цель - создать двустороннюю привязку между списком автомобилей .Net и списком: когда пользователь вводит автомобиль в текстовое поле, он обновляется только в списке .Net, а списокобновляется автоматически.

Когда пользователь нажимает кнопку «удалить» в графическом интерфейсе, автомобиль удаляется из графического интерфейса и автоматически обновляется список .Net.

Я начал писать xamlкод, но понял, что я на самом деле не знаю, как сделать привязку с обеих сторон (c # и xaml):

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:c="clr-namespace:WpfApplication1"
    Title="Window1" Height="300" Width="369" Loaded="Window_Loaded">
    <Window.Resources>
        <ObjectDataProvider x:Key="carsData" 
                        ObjectType="{x:Type c:Window1}" />
    </Window.Resources>
    <Grid Width="332">
        <ListBox Margin="10,62,0,100" Name="myListBox" HorizontalAlignment="Left" Width="120" ItemsSource="{Binding Source={StaticResource CarsData}}"/>
        <Button Height="23" Margin="66,0,0,65" Name="addBtn" VerticalAlignment="Bottom" Click="addBtn_Click" HorizontalAlignment="Left" Width="64">add</Button>
        <TextBox Margin="10,0,0,64.48" Name="myTextBox" Height="23" VerticalAlignment="Bottom" HorizontalAlignment="Left" Width="47" />
        <Button Height="23" Margin="66,0,0,33" Name="removeButton" VerticalAlignment="Bottom" HorizontalAlignment="Left" Width="64" Click="removeButton_Click">Remove</Button>
    </Grid>
</Window>

Вот мой код c #:

public partial class Window1 : Window
{
    MyModel listMgr;
    ObservableCollection<Car> carList;

    public Window1()
    {
        InitializeComponent();
        listMgr = new MyModel();
    }

    private void addBtn_Click(object sender, RoutedEventArgs e)
    {
        listMgr.add(new Car(0, myTextBox.Text, 2011));

    }

    private void removeButton_Click(object sender, RoutedEventArgs e)
    {
        //myListBox.Items.RemoveAt(0);
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        carList = listMgr.getList();
        myListBox.DataContext = carList;
        //secondListBox.DataContext = carList;
    }
}

1 Ответ

3 голосов
/ 06 марта 2011

Это быстрая версия, вам нужно будет добавить код, чтобы проверить, выбран ли автомобиль и т. Д.

Чтобы просмотреть данные вашего автомобиля, вам нужно определить шаблон данных.В этом примере это просто простое имя, но вы можете изменить цвет текста, размер шрифта, добавить дополнительные поля и т. Д.

Лучше всего работать со списком при добавлении / удалении автомобилей, а не непосредственно со списком.

XAML:

<Window x:Class="cars.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <DataTemplate x:Key="car_template" DataType="Car">
        <TextBlock Text="{Binding name}"/>
    </DataTemplate>
</Window.Resources>
<StackPanel>
    <ListBox x:Name="cars_box" Margin="5" ItemsSource="{Binding}" ItemTemplate="{StaticResource car_template}"/>
    <TextBox x:Name="new_car_box" Margin="5"/>
    <Button Content="add" Click="add_car" Margin="5"/>
    <Button Content="delete" Click="delete_car" Margin="5"/>
</StackPanel>

C #:

using System.Collections.ObjectModel;
using System.Windows;    
public partial class MainWindow : Window
{
    ObservableCollection<Car> cars = new ObservableCollection<Car>();
    public MainWindow()
    {
        InitializeComponent();            
        cars.Add(new Car("Volvo"));
        cars.Add(new Car("Ferrari"));
        cars_box.DataContext = cars;
    }

    private void add_car(object sender, RoutedEventArgs e)
    {
        cars.Add(new Car(new_car_box.Text));
    }

    private void delete_car(object sender, RoutedEventArgs e)
    {
        cars.Remove((cars_box.SelectedItem as Car));
    }
}

public class Car
{
    public string name { get; set; }
    public Car(string _name)
    {
        this.name = _name;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...