如何在两个同步框中动态显示列表框

时间:2018-10-16 10:49:21

标签: c# xml wpf

我目前正在将数据从一个列表框传输到另一个列表框。 使用WPF,我可以:

            <Grid>
                <ListBox Margin="10,29,194,301" Name="LeftListBox"/>
                <ListBox Margin="0,29,16,301" Name="RightListBox" HorizontalAlignment="Right" Width="173" />
                <Button Name="AddButton" Height="23" Margin="34,135,227,0" VerticalAlignment="Top"
                Click="AddButton_Click">Add &gt;&gt;</Button>
                <Button Name="RemoveButton" Margin="227,135,34,264" 
                Click="RemoveButton_Click">&lt;&lt; Remove</Button>
            </Grid>

对于我的C#代码,我创建了两个方法,它们使用字符串数组和右数组来加载左框的元素。 现在,我的问题是我希望将左框的元素放置在右框列表的最后一个元素之后的右框中。因此,当我单击添加时,它应该执行以下方法:

    private void AddButton_Click(object sender, RoutedEventArgs e)
    {
        // Find the right item and it's value and index
        currentItemText = LeftListBox.SelectedValue.ToString();
        currentItemIndex = LeftListBox.SelectedIndex;

        ObservableCollection<string> oList;
        oList = new System.Collections.ObjectModel.ObservableCollection<string>(toRemoveList);
        RightListBox.DataContext = oList;

        Binding binding = new Binding();
        RightListBox.SetBinding(ListBox.ItemsSourceProperty, binding);

        (RightListBox.ItemsSource as ObservableCollection<string>).Add(currentItemText);
        if (toAddList != null)
        {
            toAddList.RemoveAt(currentItemIndex);
        }

        // Refresh data binding
                   ApplyDataBinding();
    }

但是问题是,当我从左侧框中选择一个项目,然后单击添加时,它将新项目添加到右侧框中,但是当我添加第二个项目时,它将替换我在其中添加的最后一个项目第一步。

此后,第二个问题是,如何实现RemoveButton_Click?和以前的方法一样吗?

1 个答案:

答案 0 :(得分:0)

您无需为此花费太多代码。请按照以下给定的步骤操作,以实现更健壮和可维护的方法。

  1. 创建两个Observablecollection,分别与左右ListBox
  2. Observablecollection绑定到ListBox
  3. Add按钮上单击,从分配给左侧列表框的可观察集合中删除item,并将其添加到绑定到右网格的可观察集合中。

您无需显式更新绑定。可观察的集合会自动通知集合更改。

在代码中-

public ObservableCollection<ApplicationFormats> Formats { get; set; }

Xaml-

<ListBox Name="LeftListBox" ItemsSource="{Binding Formats}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>