来自DataTemplate对象的UWP Invoke方法

时间:2016-02-14 08:18:41

标签: c# xaml win-universal-app

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

我有一个ListView,它将包含我想要自定义的ListViewItem。

我制作的ListViewItem有两个TextBlocks和一个ToggleSwitch。当ToggleSwitch打开/关闭时,我想让它从实例化对象调用一个方法,或者从同一个窗体调用一个方法,但不知何故检索最初加载到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() + ")";
        //}
    }
     }

我必须实现什么来实现这一目标?

1 个答案:

答案 0 :(得分:1)

首先,您可以使用IsOn模式绑定向模型中添加属性并绑定到ToggleSwitch中的TwoWay属性。在这种情况下,您的模型必须实现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>