Как я могу получить имена выбранных элементов в окне списка режима множественного выбора - PullRequest
0 голосов
/ 16 сентября 2011

У меня есть окно со списком режима множественного выбора, и я должен получить выбранные элементы в массив строк.Я хочу получить все идентификаторы аккаунта, проверенные пользователем.Как я могу получить выбранные пользователем элементы?

XML

<ListBox Background="Transparent" Canvas.Left="18" Canvas.Top="74" Height="183" Name="listBoxAccountType" SelectionChanged="listBoxAccountType_SelectionChanged" SelectionMode="Multiple" Width="390" Visibility="Collapsed">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Border BorderThickness="0,1,0,0" BorderBrush="#FFC1BCBC" Width="490">
                <Grid Height="80">
                    <CheckBox IsChecked="{Binding IsChecked}" Checked="CheckBox_Checked" Margin="0,0,0,0" Unchecked="CheckBox_Unchecked" BorderBrush="Black" Background="#FF3BB9FF" />
                    <TextBlock FontSize="20" FontWeight="Bold" Foreground="Black" Margin="50,12,0,0" Name="tbSelectedAccountType" Text="{Binding}" />
                </Grid>
            </Border>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Account.cs

[DataContract]
public class Accounts
{
    public Accounts() { }

    public Accounts(int accid, int clid)
    {
        this.accountId = accid;
        this.clientId = clid;
    }
    public bool IsChecked
    {
        get;
        set;
    }

    // [DataMember(Name = "accountId")]
    [DataMember]
    public int accountId
    { get; set; }

    //[DataMember(Name = "clientId")]
    [DataMember]
    public int clientId
    { get; set; }
}

xaml.cs

private void listBoxAccountType_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (listBoxAccountType.SelectedIndex >= 0)
    {
        canvasType.Visibility = Visibility.Collapsed;
        canvas_Mask.Visibility = Visibility.Collapsed;
        string text = "";
        foreach (var item in listBoxAccountType.SelectedItems)
        {

            text += item.ToString() + " ";
        }
        Console.WriteLine(text);
        textBoxAccounts.Text = objAccountsName[listBoxAccountType.SelectedIndex];
        Accounts objAccounts = (Application.Current as App).m_objAccounts[listBoxAccountType.SelectedIndex];
        strAccountId = objAccounts.accountId.ToString();
    }
}

private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
    ListBoxItem checkedItem = this.listBoxAccountType.ItemContainerGenerator.ContainerFromItem((sender as CheckBox).DataContext) as ListBoxItem;
    if (checkedItem != null)
    {
        checkedItem.IsSelected = true;
    }
}

private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
    ListBoxItem checkedItem = this.listBoxAccountType.ItemContainerGenerator.ContainerFromItem((sender as CheckBox).DataContext) as ListBoxItem;
    if (checkedItem != null)
    {
       // Accounts obj = checkedItem.it;
        checkedItem.IsSelected = false;
    }
}

1 Ответ

1 голос
/ 16 сентября 2011

Откажитесь от пользовательской обработки Checked (т. Е. Удалите метод CheckBox_Checked). В этом нет необходимости, поскольку вы используете DataBinding для свойства Checked.

Чтобы получить отмеченные элементы, просто отфильтруйте элементы из вашего связанного источника данных, где IsChecked - true.

Однако, судя по всему, вы не используете правильные привязки данных для списка, и я настоятельно рекомендую вам прочитать об этой теме

Для фильтрации элементов LINQ - ваш лучший друг:

var checkedItems = myItems.Where(i => i.Checked == true)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...