2014-09-25 44 views
0

我在.xaml.cs的功能,我想呼吁:我可以通过DataTrigger(XAML)调用函数吗?

.xaml.cs

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

像这个帖子: Make ListView.ScrollIntoView Scroll the Item into the Center of the ListView (C#) 回答1

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

XAML:

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

我没有任何想法如何通过更改DataModel来提高此功能。 在每一个教程中,我都通过事件/命令来做到这一点。

Thx

+0

您使用的是MVVM模式或做法背后一个纯代码? – AwkwardCoder 2014-09-25 11:26:09

+0

我试试MVVM。但即时通讯这个 – 2014-09-25 11:34:39

回答

0

这是我的AutoToolItemToCenter TreeView与DataTrigger的解决方案,因此它不是滚动的选定项目。

在XAML我通过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); 

     } 
    } 

这个简单的例子之后创建自己的行为,并添加上述的稍微改变功能链接

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。

THX的行为的idead用户AwkwardCoder

如果任何人有一些改进的窍门,我想听听它;-)

0

我认为你不能。 DataTrigger仅用于更改WPF级别的显示。标准方法是使用控件提供的事件。

+0

非常新,所以这是从ViewModel到.xaml.cs的方式?我认为我可以在不添加代码的情况下处理ViewModel ... – 2014-09-25 11:31:27

+0

,正如我在下面所述,您可以使用xaml行为 – AwkwardCoder 2014-09-25 11:32:23

+0

ty来做到这一点,行为是一个不错的解决方案!用明码来回答=) – 2014-09-25 14:55:07

0

TreeViewItem类有一个IsSelected,重要的是一个Selected事件,所以理论上你可以在TreeViewItem创建时为它们设置事件处理程序。

Hopefullt这应该是显而易见的,这将无法在MVVM secenario中工作,因为您将无法访问创建的TreeViewItem实例,在这种情况下,我会寻找这样做与TreeView控件的行为。

相关问题