我正在尝试使用新的 x:Bind 绑定 ListView.SelectedItem。我的代码:
看法:
//MainPage.xaml:
<Page
x:Class="BrokenListSample.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:BrokenListSample"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="Beige">
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<ListView Grid.Row="0" Background="LawnGreen"
ItemsSource="{x:Bind ViewModel.MyItems, Mode=OneWay}"
SelectedItem="{x:Bind ViewModel.BestItem, Mode=TwoWay}"
Width="300" Height="300"/>
<ListView Grid.Row="1" Background="LawnGreen"
ItemsSource="{Binding MyItems, Mode=OneWay}"
SelectedItem="{Binding BestItem, Mode=TwoWay}"
Width="300" Height="300"/>
</Grid>
代码隐藏:
//MainPage.xaml.cs:
using Windows.UI.Xaml.Controls;
namespace BrokenListSample
{
public sealed partial class MainPage : Page
{
public MainPageViewModel ViewModel { get; set; }
public MainPage()
{
InitializeComponent();
DataContextChanged += (s, e) => { ViewModel = DataContext as MainPageViewModel; };
DataContext = new MainPageViewModel();
}
}
}
最后是 ViewModel:
//MainPageViewModel.cs:
using System.Collections.ObjectModel;
using System.ComponentModel;
namespace BrokenListSample
{
public class MainPageViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
private ObservableCollection<string> _myItems;
public ObservableCollection<string> MyItems
{
get { return _myItems; }
set { _myItems = value; OnPropertyChanged("MyItems"); }
}
private string _bestItem;
public string BestItem
{
get { return _bestItem; }
set { _bestItem = value; OnPropertyChanged("BestItem"); }
}
public MainPageViewModel()
{
MyItems = new ObservableCollection<string>() { "One", "Two", "Three", "Four" };
}
}
}
如您所见,我的 MainPage 上有两个 ListView 控件。如果您尝试运行此代码,请根据您要检查的绑定类型对其中一个进行注释。第二行的 ListView 使用旧的良好绑定,它只是简单地工作。这里没有惊喜。
Surprise 使用了导致 StackOverflowException 的新 x:Bind。在 OneWay 模式下工作正常 - 但是每当我单击其中一个项目时,TwoWay 都会抛出 StackOverflowException ......很搞笑......
我的问题很简单——“为什么以及如何解决这个问题?”