这听起来像是一个微不足道的问题,但我在网上找不到任何有效的东西。我正在使用PRISM并且在我走开之前迈出了一步,永远不会回到这个框架。原因如下:
我有漂亮ObservableCollection,如果我给你一个列表,并忘掉它基本的工作原理。但这不是 的目标ObservableCollection,对吧?它改变了..所以,这是集合:
<DataGrid ItemsSource="{Binding Items, Mode=TwoWay}" AutoGenerateColumns="True" />
private ObservableCollection<Item> _items = new ObservableCollection<Item>();
public ObservableCollection<Item> Items
{
get { return _items; }
set { SetProperty(ref _items, value); }
}
Run Code Online (Sandbox Code Playgroud)
所以,这里是:
Items = InitializeItems(); // Works great!
Items.Add(new Item() { ItemId = 1 }); // Also works
Run Code Online (Sandbox Code Playgroud)
但是之后..
for (int i = 1; i < 10; i++)
{
Items.Add(new Item() { ItemId = i });
}
Run Code Online (Sandbox Code Playgroud)
失败.. 有时,除了:
PresentationFramework.dll 中出现类型为“System.InvalidOperationException”的未处理异常 附加信息:ItemsControl 与其项目源不一致。
AddRange() …
在Xamarin.Forms,在 PCL 中,我有自定义控件,带有自定义事件:
public class TestGrid : Grid
{
public EventHandler OnTapped;
public TestGrid()
{
var tgr = new TapGestureRecognizer { NumberOfTapsRequired = 1 };
tgr.Tapped += Tgr_Tapped;
this.GestureRecognizers.Add(tgr);
}
private void Tgr_Tapped(object sender, EventArgs e)
{
OnTapped?.Invoke(sender, e);
}
}
Run Code Online (Sandbox Code Playgroud)
在我的起始页中,我有:
public partial class StartPage : ContentPage
{
public StartPage()
{
InitializeComponent();
BindingContext = new StartPageViewModel();
MainGrid.OnTapped += OnGridTapped;
}
private void OnGridTapped(object sender, EventArgs e)
{
Debug.WriteLine("Tapped!");
}
}
Run Code Online (Sandbox Code Playgroud)
我的 XAML 看起来像这样,它可以工作:
<v:TestGrid x:Name="MainGrid" />
Run Code Online (Sandbox Code Playgroud)
但! …