Как извлечь значение из выбранного элемента TextBlock в ListBox? - PullRequest
2 голосов
/ 02 июня 2011

Я использую ListBox для отображения всех значений, содержащихся в объекте Dictionary <>:

<ListBox Height="519" x:Name="ContactsListBox" Width="460" Margin="0,0,0,0" SelectionChanged="ContactsListBox_SelectionChanged">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="{Binding Key}" Margin="5" Foreground="{StaticResource PhoneAccentBrush}"/>
                    <TextBlock x:Name ="LastNameData" Text="{Binding Value}" Margin="20, 0" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
</ListBox>

Содержимое заполняется следующим кодом:

Dictionary<long, Contact> contacts = new Dictionary<long, Contact>();
this.ContactsListBox.ItemsSource = contacts;

Теперь я хотел бы «узнать», какой конкретный «Контакт» в ListBox в настоящее время выбран, либо узнав его Ключ, либо просто извлекая значение из TextBlock «LastNameData».

Я пытался сделать что-то подобное, но, очевидно, это не сработало:

private void ContactsListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ListBox lb = this.ContactsListBox.SelectedItem as ListBox;
    this.Test_SomeOtherTextBlock.Text = lb.ToString();
}

Буду очень признателен за вашу помощь!

Ответы [ 5 ]

3 голосов
/ 02 июня 2011

Вы можете даже выполнить следующее:

<ListBox Height="519" x:Name="ContactsListBox" Width="460" Margin="0,0,0,0" >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical">
                        <TextBlock Text="{Binding Key}" Margin="5"/>
                        <TextBlock x:Name ="LastNameData" Text="{Binding Value}" Margin="20, 0" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <Grid DataContext="{Binding ElementName=ContactsListBox, Path=SelectedItem}" Margin="0,470,0,0">
            <TextBlock Text="{Binding Value}"/>
        </Grid>

Так что вам не нужен код позади ...

BR,

TJ

0 голосов
/ 30 мая 2012

Попробуй это у меня работает, поможет тебе ...

private void ListBox_SelectionChanged (отправитель объекта, SelectionChangedEventArgs e)

{

ListBox ContactListBox = отправитель как ListBox;

ListBoxItem listBoxItem = ContactListBox .ItemContainerGenerator.ContainerFromItem (ContactListBox.SelectedItem) как ListBoxItem;

if (listBoxItem == null)

{

            return;

}

TextBlock txtBlock = FindVisualChildByName (listBoxItem, "ListTextBlock");

MessageBox.Show (txtBlock.Text);

* *} Тысяча двадцать-один
    private static T FindVisualChildByName<T>(DependencyObject parent, string name) where T : DependencyObject
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
        {
            var child = VisualTreeHelper.GetChild(parent, i);
            string controlName = child.GetValue(NameProperty) as string;
            if (controlName == name)
            {
                return child as T;
            }
            T result = FindVisualChildByName<T>(child, name);
            if (result != null)
                return result;
        }
        return null;
    }
0 голосов
/ 03 июня 2011

Есть несколько проблем:

В Xaml вы, вероятно, не хотите отображать имя класса, но разумную строку, например:

<TextBlock x:Name ="LastNameData" Text="{Binding Value.LastName}" Margin="20, 0" />

При обработке выборавыбранный элемент - KeyValuePair <...>.Вы можете легко найти его самостоятельно, если посмотрите на возвращаемый тип в отладчике.(Должно быть рефлексом для программиста, поэтому такие вопросы никогда не должны появляться:))

private void ContactsListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { 
    KeyValuePair<long, Contact> kv = (KeyValuePair<long, Contact>)this.ContactsListBox.SelectedItem;
    Contact c = (Contact)kv.Value;
    Debug.WriteLine(c.LastName);
}
0 голосов
/ 02 июня 2011

Ваш код хорош, использование ListBox.SelectedItem является правильным подходом.

Я думаю, проблема в том, что вы должны использовать его как ListBoxItem, а не ListBox.А также, чтобы получить его значение с помощью DataContext, что-то вроде этого (не проверял, я не уверен, что получу доступ к значению DataContext в последней строке):

private void ContactsListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ListBoxItem lbi = this.ContactsListBox.SelectedItem as ListBoxItem;
    var dataContext = lbi.DataContext;
    this.Test_SomeOtherTextBlock.Text = dataContext.Value.ToString();
}
0 голосов
/ 02 июня 2011


<code>private void ContactsListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ListBox lb = this.ContactsListBox.SelectedItem as ListBox;
    this.Test_SomeOtherTextBlock.Text = lb.ToString();
}
пойдет что-то вроде этого ..
<code>
private void ContactsListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ListBox lb = this.ContactsListBox.SelectedItem as ListBox;
    DataTemplate template=lb.ContentTemplate;
    //Now here you have to extract the content of the data template 
      and then you need to extract the TextBlock from that content.</p>

<p>}
Это просто обзор функциональности. Извините, не удалось опубликовать полный код.
...