microsoft / XamlBehaviors

This is the official home for UWP XAML Behaviors on GitHub.
MIT License
692 stars 110 forks source link

EventTriggerBehavior EventName="Loaded" doesn't fires after third update / not reliable #229

Open antokhio opened 1 year ago

antokhio commented 1 year ago

Hi, I'm building chat like form app, and i noted a strange behavior with

<interactivity:Interaction.Behaviors>
    <core:EventTriggerBehavior EventName="Loaded">
        <core:InvokeCommandAction Command="{x:Bind SetCanvasCommand}" CommandParameter="{Binding ElementName=inkCanvas}"/>
    </core:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>

so i have Page and ViewModels

the ViewModel looks like this:

public class ViewModel : ObservableObject
{
    public ObservableCollection<object> Items;
    public RelayCommand AddItem {get; private set;}

    public CreateReviewViewModel() 
    {
        Items = new ObservableCollection<object>();
        AddItem = new RelayCommand(() => items.Add(new InkCanvasViewModel()));
    }
}

public class InkCanvasViewModel : ObservableObject
{
    public RelayCommand<InkCanvas> CanvasLoadedCommand {get; private set;}
    private InkCanvas inkCanvas;

    public CreateReviewViewModel() 
    {
        CanvasLoadedCommand = new RelayCommand<InkCanvas>((args) => inkCanvas = args);
    }   
}

codes is cropped to necessary part

in page i have

<Page ...>
    <Page.Resources>
        <DataTemplate x:Key="inkCanvasTemplate" x:DataType="vm:InkCanvasViewModel">
            <InkCanvas x:Name="inkCanvas">
                <interactivity:Interaction.Behaviors>
                    <core:EventTriggerBehavior EventName="Loaded">
                        <core:InvokeCommandAction Command="{x:Bind CanvasLoadedCommand}" CommandParameter="{Binding ElementName=inkCanvas}"/>
                    </core:EventTriggerBehavior>
                </interactivity:Interaction.Behaviors>-->
            </InkCanvas>
        </DataTemplate>
        <helpers:MyTemplateSelector x:Key="templateSelector" InkCanvasTemplate="{StaticResource inkCanvasTemplate}"/>
    </Page.Resources>
    <ListView x:Name="bottomUpList" ItemsSource={x:Bind ViewModel.Items, Mode=OneWay} ItemTemplateSelector={StaticResource templateSelector}/>
</Page>

so whatever i add CanvasTemplate after third add the InvokeCommandAction doesn't fires, instead i do

<InkCanvas ... Loaded="{x:Bind inkCanvas_Loaded}"/> 

that fires properly...