Как добавить выбранный элемент из AutoCompleteBox в ListBox или Datagrid? - PullRequest
0 голосов
/ 07 марта 2011

Я пытаюсь создать сценарий, в котором я могу выбрать любой элемент из коллекции элементов и могу добавить эту текстовую строку в список или сетку данных, нажав кнопку «Добавить».Мне также нужно иметь возможность удалить элемент из списка или сетки данных, нажав кнопку «Удалить».Я начал это, но есть проблема, чтобы заставить это работать.Мне интересно, в чем проблема.Любые идеи высоко ценятся.Спасибо!

XAML:

<UserControl 
xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"  
x:Class="AutoCompleteBoxSimpleTest.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  
xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"
mc:Ignorable="d" >

<StackPanel x:Name="LayoutRoot" Background="White" Width="150">
    <TextBlock Text="{Binding ElementName=MyAutoCompleteBox, Path=SelectedItem, TargetNullValue='No item selected', StringFormat='Selected Item: {0}'}" />      
    <sdk:AutoCompleteBox x:Name="MyAutoCompleteBox" IsTextCompletionEnabled="True" ItemsSource="{Binding Items}" />
    <Button x:Name="AddButton" Click="AddButton_Click" Content="AddButton" />
    <Button x:Name="RemoveButton" Click="RemoveButton_Click" Content="RemoveButton" />
    <ListBox x:Name="ListBox" BorderThickness="0" SelectionMode="Multiple" />

    <sdk:DataGrid x:Name="dgEditPackageProperties_ADEntities">
        <sdk:DataGrid.Columns>
            <sdk:DataGridTemplateColumn x:Name="dgtcEditPackageProperties_Icon"/>
            <sdk:DataGridTextColumn x:Name="dgtcEditPackageProperties_Entities" Header="AD Entities with Access" /> 
        </sdk:DataGrid.Columns> 
    </sdk:DataGrid>
</StackPanel>

Код сзади:

public partial class MainPage : UserControl
{
    private IList<string> myDataList = null;
    string currentItemText;
    public IList<string> Items
    {
        get;
        private set;
    }

    public MainPage()
    {
        InitializeComponent();

        Items = new List<string>();
        Items.Add("One");
        Items.Add("Two");
        Items.Add("Three");
        Items.Add("Four");

        DataContext = this;
    }

    private void AddButton_Click(object sender, RoutedEventArgs e)
    {
        if (MyAutoCompleteBox.SelectedItem != null)
        {

            foreach (var item in MyAutoCompleteBox.SelectedItem)
            {
                ListBox.Items.Add(item);
                myDataList.Remove(item);
            }
            ApplyDataBinding();
        }
    }

    private void RemoveButton_Click(object sender, RoutedEventArgs e)
    {
        if (ListBox.SelectedItems != null)
        {
            int count = ListBox.SelectedItems.Count - 1;
            for (int i = count; i >= 0; i--)
            {
                //myDataList.Add(ListBox.SelectedItems[i]);
                ListBox.Items.Remove(ListBox.SelectedItems[i]);
            }
            ApplyDataBinding();
        }
    }

    private void ApplyDataBinding()
    {
        MyAutoCompleteBox.ItemsSource = null;
        MyAutoCompleteBox.ItemsSource = myDataList;
    }

}

Ответы [ 2 ]

1 голос
/ 07 марта 2011

Для начала, если вы используете ObservableCollection <> для myDataList вместо List <>, вы можете просто добавлять и удалять элементы, и элемент управления будет автоматически обновляться.

Во-вторых, старайтесь не удалять элементы, покаперебирая их.Сначала поместите их в отдельный список.

И, наконец, где вы вообще СОЗДАЕТЕ myDataList?:)

0 голосов
/ 08 марта 2011

Вместо присвоения имени блоку автозаполнения и проверки выбранного элемента таким образом, вы можете просто привязать его к свойству selectedItem.Затем в вашем AddButton_Click вы можете просто добавить выбранный элемент, к которому привязываетесь.

...