我可以通过DataTrigger(XAML)调用函数吗? [英] Can i call a function via DataTrigger (XAML)?

查看:76
本文介绍了我可以通过DataTrigger(XAML)调用函数吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

.xaml.cs中有一个我想调用的函数:

I have a function in .xaml.cs which i wanted to call:

.xaml.cs

private void treeView_SelectedItemChanged(object sender, EventArgs e)
{
        //treeView.ScrollToCenterOfView(sender as TreeViewItem);
}

喜欢这篇文章:制作ListView.ScrollIntoView滚动浏览项进入ListView(C#)的中心答案1

like from this post: Make ListView.ScrollIntoView Scroll the Item into the Center of the ListView (C#) Answer 1

但是我不使用SelectedItem,我的方法将是:

But i dont use the SelectedItem, my approach would be like:

XAML:

<Style.Triggers>
     <DataTrigger Binding="{Binding Path=IsActive}" Value="true">
          // ###call this function
     </DataTrigger>
</Style.Triggers>

我不知道如何通过更改DataModel来提高此功能.在每个教程中,我都通过事件/命令来做到这一点.

I dont have any Idea how to raise this function by change of the DataModel. In every Tutorial i have gooled they do it via Event/Command.

Thx

推荐答案

这是我对带有DataTrigger的Auto-ScrollItemToCenter TreeView的解决方案,因此不是滚动的选定项.

Here's my solution for an Auto-ScrollItemToCenter TreeView with a DataTrigger, so it's not the selected item which scrolls.

在XAML中,我通过DataTrigger添加了自定义行为

In XAML i added a custom Behavior via DataTrigger

                <Style TargetType="TreeViewItem" BasedOn="{StaticResource {x:Type TreeViewItem}}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=IsSelectedInGrid}" Value="true">
                            <Setter Property="local:TreeViewScrollBehavior.ScrollItemToCenter" Value="true" />
                        </DataTrigger>
                    </Style.Triggers>

在这个来自 http://的简单示例之后,我尝试创建自己的行为www.shujaat.net/2010/08/attached-behaviors.html

public static class TreeViewScrollBehavior
{
    public static DependencyProperty ScrollItemToCenterProperty =
DependencyProperty.RegisterAttached("ScrollItemToCenter", typeof(bool),
typeof(TreeViewScrollBehavior), new UIPropertyMetadata(false, OnScrollItemToCenter));


    public static bool GetScrollItemToCenter(DependencyObject obj)
    {
        return (bool)obj.GetValue(ScrollItemToCenterProperty);
    }

    public static void SetScrollItemToCenter(DependencyObject obj, bool value)
    {
        obj.SetValue(ScrollItemToCenterProperty, value);
    }

    public static void OnScrollItemToCenter(DependencyObject d,
        DependencyPropertyChangedEventArgs e)
    {

        if ((bool)e.NewValue)
        {
            //TreeViewItem t = GetTreeViewItem(d);
            TreeViewItem t = (TreeViewItem)d;
            TryScrollToCenterOfView(GetTree(t), t);

        }
    }

并添加了上述链接的稍作更改的功能

and added the slightly changed functions of the above mentioned link

    private static TreeView GetTree(TreeViewItem item)
    {
        var parent = VisualTreeHelper.GetParent(item);
        while (!(parent is TreeView))
        {
            parent = VisualTreeHelper.GetParent(parent);
        }
        return parent as TreeView;
    }


    private static void TryScrollToCenterOfView(ItemsControl itemsControl, UIElement container)
    {
        // Find the container
        //var container =  itemsControl.ItemContainerGenerator.ContainerFromItem(item) as UIElement;
        if (container == null) return;

        // Find the ScrollContentPresenter
        ScrollContentPresenter presenter = null;
        for (Visual vis = container; vis != null && vis != itemsControl; vis = VisualTreeHelper.GetParent(vis) as Visual)
            if ((presenter = vis as ScrollContentPresenter) != null)
                break;
        if (presenter == null) return;

        // Find the IScrollInfo
        var scrollInfo =
            !presenter.CanContentScroll ? presenter :
            presenter.Content as IScrollInfo ??
            FirstVisualChild(presenter.Content as ItemsPresenter) as IScrollInfo ??
            presenter;

        // Compute the center point of the container relative to the scrollInfo
        Size size = container.RenderSize;
        Point center = container.TransformToAncestor((Visual)scrollInfo).Transform(new Point(size.Width / 2, size.Height / 2));
        center.Y += scrollInfo.VerticalOffset;
        center.X += scrollInfo.HorizontalOffset;

        // Adjust for logical scrolling
        if (scrollInfo is StackPanel || scrollInfo is VirtualizingStackPanel)
        {
            double logicalCenter = itemsControl.ItemContainerGenerator.IndexFromContainer(container) + 0.5;
            Orientation orientation = scrollInfo is StackPanel ? ((StackPanel)scrollInfo).Orientation : ((VirtualizingStackPanel)scrollInfo).Orientation;
            if (orientation == Orientation.Horizontal)
                center.X = logicalCenter;
            else
                center.Y = logicalCenter;
        }

        // Scroll the center of the container to the center of the viewport
        if (scrollInfo.CanVerticallyScroll) scrollInfo.SetVerticalOffset(CenteringOffset(center.Y, scrollInfo.ViewportHeight, scrollInfo.ExtentHeight));
        if (scrollInfo.CanHorizontallyScroll) scrollInfo.SetHorizontalOffset(CenteringOffset(center.X, scrollInfo.ViewportWidth, scrollInfo.ExtentWidth));
    }

    private static double CenteringOffset(double center, double viewport, double extent)
    {
        return Math.Min(extent - viewport, Math.Max(0, center - viewport / 2));
    }
    private static DependencyObject FirstVisualChild(Visual visual)
    {
        if (visual == null) return null;
        if (VisualTreeHelper.GetChildrenCount(visual) == 0) return null;
        return VisualTreeHelper.GetChild(visual, 0);
    }

这是在xaml.cs或DataObject中滚动不带代码的TreeView的完整解决方案.

That's my complete solution to scroll a TreeView without Code in xaml.cs or the DataObject.

向用户AwkwardCoder提出行为"的想法

Thx for the idead of Behaviors to the user AwkwardCoder

如果有人有一些改善的建议,我喜欢听;-)

If anyone has some tipps for improvement, i like to hear it ;-)

这篇关于我可以通过DataTrigger(XAML)调用函数吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆