列表框绑定上的选定项
本文关键字:绑定 列表 | 更新日期: 2023-09-27 18:14:39
我有一个绑定的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堆栈,这很简单,因为你只需在视图模型中为选定项目创建一个完整属性,然后像绑定其他任何东西一样绑定到它。例如,使用上面的代码,我将这样做:
/// <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到上面的属性(前提是你已经设置了数据上下文属性:
)<ListBox Name="list" SelectionChanged="list_SelectionChanged" SelectedItem="{Binding SelectedListItem, Mode=TwoWay}">
这样您就可以查询Selected Item Property来查找值
看看默认情况下作为新Databound应用程序的一部分创建的代码。它展示了如何通过查询SelectionChanged事件处理程序中的e.AddedItems
属性来访问SelectedItem。
我个人会使用带有命令绑定的按钮,但我想你可以这样开始:
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>