UWP 从 DataTemplate 对象调用方法

UWP Invoke method from DataTemplate Object

自学 程序员,欢迎对我的代码提出任何建设性的批评。

我有一个 ListView,其中包含我要自定义的 ListViewItems。

我制作的ListViewItem有两个TextBlocks和一个ToggleSwitch。当 ToggleSwitch 切换时 On/Off 我希望它从实例化对象调用方法,或从相同的表单调用方法,但以某种方式检索最初加载到 DataTemplate 中的对象。

这里是 XAML 到目前为止:

    <ListView x:Name="listViewAddedVideoFolders" Grid.Row="1" DoubleTapped="listViewAddedVideoFolders_DoubleTapped" SelectionChanged="listViewAddedVideoFolders_SelectionChanged" HorizontalContentAlignment="Stretch">
        <ListView.ItemTemplate>
            <DataTemplate>                    
                <Grid HorizontalAlignment="Stretch">
                    <TextBlock HorizontalAlignment="Stretch" VerticalAlignment="Center" Text="{Binding Directory}"/>                           
                    <Grid HorizontalAlignment="Right">
                        <StackPanel>
                            <TextBlock Text="Find Videos: "></TextBlock>
                            <ToggleSwitch Toggled="listViewVideoFolder_toggled" />
                        </StackPanel>
                    </Grid>
                </Grid>  
            </DataTemplate>
        </ListView.ItemTemplate>
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            </Style>
        </ListView.ItemContainerStyle>

现在正在调用listViewVideoFolder_toggled

在我尝试使用 Toggled="{Binding StartCrawling()}"

之前

这是我将 listviewitems 绑定到的 AddVideoFolderModel 对象

namespace Movie_Management_Windows_10.Models
{
    public class AddVideoFolderModel
    {
        public static ObservableCollection<AddVideoFolderModel> MyVideoFolderModels = new ObservableCollection<AddVideoFolderModel>();
        public int VideosFound { get; set; }
        public string Directory { get; set; }
        public string DirectoryName { get; set; }
        private bool isCrawling = false;
        public bool HasBeenCrawled = false;

        private void startCrawling()
        {
            AppShell.Current.NotifyUser("Crawling began", AppShell.NotifyType.StatusMessage);
        }


        //public override string ToString()
        //{
        //    return Directory + " (" + VideosFound.ToString() + ")";
        //}
    }
     }

我必须执行什么才能完成此操作?

首先,您可以将 属性 添加到您的模型并使用 TwoWay 模式绑定绑定到 ToggleSwitch 中的 IsOn 属性。在这种情况下,您的模型必须实现 INotifyPropertyChanged

    private bool _isNeedCrawle;

    public bool IsNeedCrawle
    {
        get
        {
            return _isNeedCrawle;
        }
        set
        {
            if (_isNeedCrawle != value)
            {
                _isNeedCrawle = value;
                if (_isNeedCrawle)
                {
                    startCrawling();
                }

                NotifyPropretyChanged("IsNeedCrawle");
            }
        }
    }

其次,您可以使用XAML Behavior SDK。在这种情况下,您必须添加对库的引用 (look how to do it),并将方法修饰符从 private 更改为 public

xmlns:i="using:Microsoft.Xaml.Interactivity"
xmlns:core="using:Microsoft.Xaml.Interactions.Core"

<ToggleSwitch>
    <i:Interaction.Behaviors>
        <core:EventTriggerBehavior EventName="Toggled">
            <core:CallMethodAction MethodName="StartCrawling" TargetObject="{Binding }"/>
        </core:EventTriggerBehavior>
    </i:Interaction.Behaviors>
</ToggleSwitch>