我创建了一个列表并用文件url填充它,我想从该数据模板内部列表中的文本块中获取该url,但我为此目的所做的功能并没有返回我期望的字符串。它给了我null。我使用的函数是ListView的SelectionChanged属性
<ListView ItemsSources="{x:Bind noticeData}"
SelectedIndex="{x:Bind MasterListView.SelectedIndex, Mode=OneWay}"
x:Name="uriList" SelectionChanged="uriList_SelectionChanged"
IsItemClickEnabled="True" Grid.Row="3">
<ListView.ItemTemplate>
<DataTemplate x:DataType="data:Datum_2">
<StackPanel>
<TextBlock x:Name="downFileUri" Grid.Row="2" Grid.Column="0"
VerticalAlignment="Center" HorizontalAlignment="Center"
Margin="0,0,0,20" Visibility="Visible"
Text="{x:Bind file_url}" TextWrapping="Wrap"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
答案 0 :(得分:1)
当您经常关注MVVM pattern时,请跳过使用控件事件处理程序,例如单击事件和选择事件。相反,该模式允许我们绑定到属性并捕获属性设置块内的属性更改。
而不是绑定到您想要绑定到SelectedIndex
SelectedItem
SelectedItem
将是您收藏的任何类型。在下面的示例中,我假设您有一个名为NoticeData
<ListBox SelectedItem="{Binding MySelectedItem, Mode=TwoWay}">
然后在你的视图模型中
private NoticeData _mySelectedItem;
public NoticeData MySelectedItem
{
get{ return _mySelectedItem; }
set{ _mySelectedItem = value;}
}
以下是ListBox上的MSDN文档,因为您会看到SelectedItem
和SelectedItems
属性。这些都可以绑定。当然,如果您启用多项选择,则会使用SelectedItems
。
您可能需要考虑的其他事情是在您的ViewModel上实现INotifyPropertyChanged(如果您还没有)。
根据评论进行修改
还有一种替代方法可用于绑定。
如果您希望将另一个元素绑定到您选择的项目,您只需要命名您的元素。
<ListBox x:Name="MyListBox" ItemsSource="{Binding myItems}"/>
<TextBlock Text="{Binding ElementName=MyListBox, Path=SelectedItem.WhatEverProperty}"/>