Получить имя выбранного элемента списка (WPF C #)? - PullRequest
0 голосов
/ 21 апреля 2011

все. У меня есть приложение, которое сканирует папку с изображениями и отображает изображения вместе с их именами в списке. Каждое изображение и имя изображения (отображаются в текстовом блоке рядом с изображением) хранятся в горизонтальной панели стека внутри списка.

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

Кто-нибудь может указать мне правильное направление, как лучше всего это сделать? Спасибо.

Вот мой xaml, если это поможет:

<Grid>

    <ListBox ItemsSource="{Binding AllImages}" Margin="0,0,262,0" Name="listBox1" MouseLeftButtonDown="listBox1_MouseLeftButtonDown">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Image Source="{Binding Image}" Width="50" Height="50" Margin="6"/>
                    <TextBlock Text="{Binding Name}" Margin="6" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>        
    <TextBox Height="23" HorizontalAlignment="Left" Margin="265,148,0,0" Name="textBox1" VerticalAlignment="Top" Width="198" />
</Grid>

И мой код позади:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
    }

    public class MyImage
    {
        private ImageSource _image;
        private string _name;

        public MyImage(ImageSource image, string name)
        {
            _image = image;
            _name = name;
        }

        public override string ToString()
        {
            return _name;
        }

        public ImageSource Image
        {
            get { return _image; }
        }

        public string Name
        {
            get { return _name; }
        }
    }

    public List<MyImage> AllImages
    {
        get
        {
            List<MyImage> result = new List<MyImage>();
            string filePath = @"D:\Projects\Visual Studio 2010\WpfApplication5\WpfApplication5\bin\Debug\ImageFolder";
            string[] files = Directory.GetFiles(filePath);
            foreach (string filename in files)
            {
                try
                {
                    result.Add(
                    new MyImage(
                    new BitmapImage(
                    new Uri(filename)),
                    System.IO.Path.GetFileNameWithoutExtension(filename)));                        
                }
                catch { }
            }
            return result;
        }
    }        

}

Ответы [ 2 ]

0 голосов
/ 21 апреля 2011

Чтобы извлечь выбранное изображение из кода, у вас есть как минимум 3 варианта (я предполагаю, что ваши изображения представлены классом ImageItem)

  • Установите IsSynchronizedWithCurrentItem в true на вашем ListBox и используйте следующий код для извлечения выбранного элемента:

    ICollectionView view = CollectionViewSource(AllImages);
    ImageItem selectedImage = (ImageItem)view.CurrentItem;
    
  • Свяжите SelectedItem из ListBox с собственностью в вашем DataContext:

    <ListBox .... SelectedItem="{Binding SelectedImage}">
    
  • Доступ к свойству SelectedItem напрямую из кода:

    ImageItem selectedImage = (ImageItem)listBox1.SelectedItem;
    

Конечно, если вы просто хотите показать имя в TextBlock, вы можете использовать решение Рассела Тройвеста

0 голосов
/ 21 апреля 2011

Взгляните на этот вопрос.

Как связать выбранный элемент Listview с текстовым полем в режиме TwoWay?

В вашем случае используйте

<TextBox Height="23" 
  HorizontalAlignment="Left" 
  Margin="265,148,0,0" 
  Name="textBox1" 
  VerticalAlignment="Top" Width="198" 
  Text="{Binding SelectedItem.Name, ElementName=listBox1}"/>
...