I have a model TestItem : IBaseItem
, custom control TestCard
of which x:DataType = "TestItem"
.
I also have a MainViewModel
, which has an ObservableCollection<IBaseItem> BrowsingItems
In the MainPage, there is a resource dictionary with DataTemplates, one of which contains the custom TestCard and its TouchBehaviour from the Community Tookit. The data from the BrowsingItems are bound to a CollectionView with the DataTemplateSelector which compares based on the if the IBaseItem is TestItem or not.
<DataTemplate x:Key="TestTemplate"
>
<controls:TestCard >
<controls:TestCard.Behaviors>
<toolkit:TouchBehavior x:DataType="vm:TestItem"
LongPressCommand="{Binding Source={x:Reference mainPage}, Path=BindingContext.ShowTestContextPopupCommand}"
LongPressCommandParameter="{Binding Mode=TwoWay}"
LongPressDuration="750" />
</controls:TestCard.Behaviors>
</controls:TestCard>
</DataTemplate>
<DataTemplate x:Key="FolderTemplate">
<controls:FolderCard />
</DataTemplate>
<controls:BrowsingItemDataTemplateSelector x:Key="BrowsingTemplateSelector"
TemplateTest="{StaticResource TestTemplate}"
TemplateFolder="{StaticResource FolderTemplate}" />
<CollectionView Grid.Row="1"
x:Name="browsingView"
ItemsSource="{Binding BrowsingItems}"
ItemTemplate="{StaticResource BrowsingTemplateSelector}">
</CollectionView>
The first Command is executed when holding mousepress on the TestCard. It displays a Popup with the Name
of the item, and a set of commands to choose from (enum), which I then plan on executing back in the MainViewModel.
The second Command for adding new TestItems based on a name chosen in another Popup. The Command is used in a binding with another button on the page.
[RelayCommand]
async void ShowTestContextPopup(TestItem testItem)
{
var popup = new TestCardContextPopup(testItem.Name);
var result = await Application.Current.MainPage.ShowPopupAsync(popup);
TestCardContextPopup.TestCommandType? testCommand = (TestCardContextPopup.TestCommandType?) result;
if (testCommand == null) return;
switch (testCommand)
{
case TestCardContextPopup.TestCommandType.DELETE:
BrowsingItems.Remove(testItem);
break;
}
}
[RelayCommand]
async void AddTest()
{
var popup = new CreateBrowsingItemPopup();
var name = await Application.Current.MainPage.ShowPopupAsync(popup);
if (name != null)
{
BrowsingItems.Add(new TestItem() { Name = (string)name});
Sort();
}
}
After the deletion, the TestCard is removed and CollectionView refreshes.
If I add another TestItem with the button, its added with the appropriate name displayed.
However, if I hold on it, the name displayed on the popup is of the previous TestItem.
it also passes the same previous reference to the ShowTestContextPopup Command.
Any ideas on how to stop it from recycling old references, or how to update the Bindings on the DataTemplate?
Jan Jonáš is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.