簡體   English   中英

ListBox綁定上的選定項目?

[英]Selected item on ListBox binding?

我有一個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

如果您使用的是MVVMlight之類的MVVM堆棧,這非常簡單,因為您只需在視圖模型中為Selected Item創建Full屬性,然后像其他任何操作一樣將其綁定到該屬性。 例如,使用上面的代碼,我會做:

        /// <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);
        }
    }

然后在Listbox XAML中,只需將Listbox Selected Item綁定到上述屬性(前提是您已經設置了data context屬性:

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

這樣,您可以查詢Selected Item屬性來查找值。

我個人會使用帶有Command綁定的Button,但是我想你可以這樣開始:

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>

查看默認情況下作為新數據綁定應用程序的一部分創建的代碼。 它顯示了如何通過查詢SelectionChanged事件處理程序中的e.AddedItems屬性來訪問SelectedItem。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM