2014-09-25 46 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控件的行爲。

相關問題