Выбранный элемент в привязке ListBox? - PullRequest
1 голос
/ 16 ноября 2011

У меня есть привязка для ListBox, но как я могу добавить событие к выбранному элементу?

MainPage.xaml:

<!--ContentPanel - place additional content here-->
<StackPanel x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <ListBox Name="list" SelectionChanged="list_SelectionChanged">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Image Source="{Binding ImageUri}" 
                           Stretch="None" 
                           Height="100"/>
                    <StackPanel Width="360" >
                        <TextBlock Text="{Binding Text}"
                                   Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                        <TextBlock Text="{Binding Opis}" 
                                   Style="{StaticResource PhoneTextSubtleStyle}"/>
                    </StackPanel>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</StackPanel>

MainPage.xaml.cs:

public partial class MainPage : PhoneApplicationPage
{
    public MainPage()
    {
        InitializeComponent();
        ObservableCollection<SampleData> dataSource = 
            new ObservableCollection<SampleData>();

        dataSource.Add(new SampleData() 
        { 
            ImageUri = "Images/appbar.delete.rest.png", 
            Text = "Item1", 
            Description = "blablabla" 
        });
        dataSource.Add(new SampleData() 
        { 
            ImageUri = "Images/appbar.delete.rest.png", 
            Text = "Item2", 
            Description = "blablabla" 
        });
        dataSource.Add(new SampleData()
        { 
            ImageUri = "Images/appbar.download.rest.png", 
            Text = "Item3", 
            Description = "blablabla" 
        });

        this.list.ItemsSource = dataSource;         
    }

    private void list_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (list.SelectedItem == null) return;
        //what next?
    }

    public class SampleData
    {
        public string Text { get; set; }
        public string Description { get; set; }
        public string ImageUri { get; set; }
    }
}

Я хочу нажать, например, на Item2 и перейти на страницу Page2.xaml.

Мой проект от VS2010: http://www.przeklej.pl/plik/wp7sampleproject6-7z-00368v7i196u

Ответы [ 3 ]

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

Если вы используете стек MVVM, такой как MVVMlight, это довольно просто, поскольку вы просто создаете полное свойство в своей модели представления для выбранного элемента и затем привязываетесь к нему, как если бы вы использовали что-либо еще. Используя ваш код, например, я бы сделал:

        /// <summary>
    /// The <see cref="SelectedListItem" /> property's name.
    /// </summary>
    public const string SelectedStickPropertyName = "SelectedListItem";

    private SampleData _selectedItem;

    /// <summary>
    /// Gets the SelectedStick property.
    /// TODO Update documentation:
    /// Changes to that property's value raise the PropertyChanged event. 
    /// This property's value is broadcasted by the Messenger's default instance when it changes.
    /// </summary>
    public SampleData SelectedListItem
    {
        get
        {
            return _selectedItem;
        }

        set
        {
            if (_selectedItem == value || value == null)
            {
                return;
            }

            var oldValue = _selectedItem;
            _selectedItem = value;

            // Update bindings, no broadcast
            RaisePropertyChanged(SelectedStickPropertyName);
        }
    }

Затем в XAML вашего списка просто привяжите выбранный элемент списка к указанному выше свойству (при условии, что вы установили свойство контекста данных:

<ListBox Name="list" SelectionChanged="list_SelectionChanged" SelectedItem="{Binding SelectedListItem, Mode=TwoWay}">

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

0 голосов
/ 16 ноября 2011

Посмотрите на код, который создан по умолчанию как часть нового приложения с привязкой к данным.В нем показано, как получить доступ к SelectedItem путем запроса свойства e.AddedItems в обработчике событий SelectionChanged.

0 голосов
/ 16 ноября 2011

Лично я бы использовал кнопки с привязками команд, но я полагаю, вы могли бы начать так:

public MainPage()
{
    InitializeComponent();
    ObservableCollection<SampleData> dataSource = new ObservableCollection<SampleData>();

    dataSource.Add(
        new SampleData()
        {
            ImageUri = "Images/appbar.delete.rest.png",
            Text = "Item1",
            Description = "blablabla",
            TargetUri = new Uri("Page1.xaml", UriKind.Relative)
        });
    dataSource.Add(
        new SampleData()
        {
            ImageUri = "Images/appbar.delete.rest.png",
            Text = "item2",
            Description = "blablabla",
            TargetUri = new Uri("Page2.xaml", UriKind.Relative)
        });
    dataSource.Add(
        new SampleData()
        {
            ImageUri = "Images/appbar.download.rest.png",
            Text = "Item3",
            Description = "blablabla",
            TargetUri = new Uri("Page3.xaml", UriKind.Relative)
        });

    this.list.ItemsSource = dataSource;
}

private void list_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var data = list.SelectedItem as SampleData;

    if (data == null)
    {
        return;
    }

    NavigationService.Navigate(data.TargetUri);
}

public class SampleData
{
    public string Text { get; set; }

    public string Description { get; set; }

    public string ImageUri { get; set; }
    public Uri TargetUri { get; set; }
}

* РЕДАКТИРОВАТЬ

Если вы хотите нажать элемент для навигации с помощью командВы можете сделать это следующим образом:

public class SampleData
{
    public string Text { get; set; }

    public string Description { get; set; }

    public string ImageUri { get; set; }
    public Uri TargetUri { get; set; }
    public ICommand NavigateCommand { get; private set; }

    public SampleData()
    {
        NavigateCommand =
            new DelegateCommand(
                () => NavigationService.Navigate(TargetUri);
    }
}

Чтобы получить экземпляр NavigationService - вы можете реализовать его самостоятельно или просто использовать App.RootFrame для выполнения вызовов навигации.Вы бы определили привязки команд примерно так:

<ListBox.ItemTemplate>
    <DataTemplate>
        <Button
            Command={Binding NavigateCommand}>
            <Button.Template>
                <ControlTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Image Source="{Binding ImageUri}" 
                               Stretch="None" 
                               Height="100"/>
                        <StackPanel Width="360" >
                            <TextBlock Text="{Binding Text}"
                                       Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                            <TextBlock Text="{Binding Description}" 
                                       Style="{StaticResource PhoneTextSubtleStyle}"/>
                        </StackPanel>
                </StackPanel>
                </ControlTemplate>
            </Button.Template>
        </Button>
    </DataTemplate>
</ListBox.ItemTemplate>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...