2010-07-16 5 views
2

건물중인 WPF 응용 프로그램에서 Model-View-ViewModel 아키텍처를 사용하고 있으며 특정 ViewModel이 실제로보기의 크기에 반응하도록하고 싶습니다. MVVM 접근법의 경우, 나는 알고있다).ScrollViewer의 ViewportWidth 및 ViewportHeight에 바인딩

본질적으로 ScrollViewer 개체가 있고 viewmodel에서 scrollviewer의 너비와 높이를 관찰 한 다음 너비와 높이가 무엇인지에 따라 적절하게 수행 할 수있게하려고합니다.

나는 같은 것을 할 싶습니다

<ScrollViewer ViewportWidth="{Binding Path=MyViewportWidth, Mode=OneWayToSource}" ViewportHeight="{Binding Path=MyViewportHeight, Mode=OneWayToSource}" /> 

그러나 물론이 "ViewportWidth"와 "ViewportHeight"가 "에 바인딩"할 수 없기 때문에 할 불가능하다 (일명 구속력 목표를 행동) 왜냐하면 그것들은 읽기 전용 의존성 프로퍼티이기 때문이다 (OneWayToSource이기 때문에이 바인딩에 전혀 쓰지 않고 있음에도 불구하고).

누구나 이런 식으로 할 수있는 좋은 방법을 알고 있습니까?

답변

1

당신 수, 이것이

private void ScrollViewer_Loaded(object sender, RoutedEventArgs e) 
{ 
    ScrollViewer sv = sender as ScrollViewer; 
    ViewModel vm = sv.DataContext as ViewModel; 

    vm.ScrollViewerHeight = sv.ViewportHeight; 
    vm.ScrollViewerWidth = sv.ViewportWidth; 
} 
1

확인 뷰 모델을 업데이트 뭔가 OnLoaded 또는 OnResizeChanged을 실행 해보십시오 정말 오래된 질문,하지만 난이 문제를 해결 한 이후이, 후손을 위해 공유하고자합니다 나 자신. 내가 찾은 최선의 해결책은 ScrollView 클래스에서 파생되고 원하는 속성을 구현하는 사용자 정의 컨트롤을 만드는 것입니다. 물론이 클래스는 기본 클래스의 바인딩 할 수없는 속성에 연결됩니다.

OnPropertyChanged 함수를 사용하여 속성을 모니터링하고 값을 동기화 상태로 유지할 수 있습니다.

다음은 DynamicScrollViewer라는 사용자 정의 사용자 정의 컨트롤의 전체 코드 숨김입니다. DynamicHorizontalOffset, DynamicVerticalOffset, DynamicViewportWidth 및 DynamicViewportHeight라는 4 개의 바인드 가능한 종속성 속성이 있습니다.

두 가지 오프셋 속성을 사용하면 오프셋의 읽기 및 쓰기 제어가 가능하며 뷰포트 속성은 기본적으로 읽기 전용입니다.

다양한 구성 요소 (왼쪽 레이블, 중간 노드, 맨 위에 타임 라인)가 동 기적으로 스크롤해야하지만 제한된 측면에서만 필요했던 복잡한 애니메이션 편집기 컨트롤을 만들 때이 클래스를 사용해야했습니다. 공통의 외부 스크롤 바운드 스프레드 시트에서 행 섹션 잠금을 생각하면 아이디어를 얻을 수 있습니다.

using System.Windows; 
using System.Windows.Controls; 

namespace CustomControls 
{ 
    public partial class DynamicScrollViewer : ScrollViewer 
    { 
     public DynamicScrollViewer() 
     { 
      InitializeComponent(); 
     } 

     public double DynamicHorizontalOffset 
     { 
      get { return (double)GetValue(DynamicHorizontalOffsetProperty); } 
      set { SetValue(DynamicHorizontalOffsetProperty, value); } 
     } 

     public static readonly DependencyProperty DynamicHorizontalOffsetProperty = 
      DependencyProperty.Register("DynamicHorizontalOffset", typeof(double), typeof(DynamicScrollViewer)); 

     public double DynamicVerticalOffset 
     { 
      get { return (double)GetValue(DynamicVerticalOffsetProperty); } 
      set { SetValue(DynamicVerticalOffsetProperty, value); } 
     } 

     public static readonly DependencyProperty DynamicVerticalOffsetProperty = 
      DependencyProperty.Register("DynamicVerticalOffset", typeof(double), typeof(DynamicScrollViewer)); 

     public double DynamicViewportWidth 
     { 
      get { return (double)GetValue(DynamicViewportWidthProperty); } 
      set { SetValue(DynamicViewportWidthProperty, value); } 
     } 

     public static readonly DependencyProperty DynamicViewportWidthProperty = 
      DependencyProperty.Register("DynamicViewportWidth", typeof(double), typeof(DynamicScrollViewer)); 

     public double DynamicViewportHeight 
     { 
      get { return (double)GetValue(DynamicViewportHeightProperty); } 
      set { SetValue(DynamicViewportHeightProperty, value); } 
     } 

     public static readonly DependencyProperty DynamicViewportHeightProperty = 
      DependencyProperty.Register("DynamicViewportHeight", typeof(double), typeof(DynamicScrollViewer)); 

     protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) 
     { 
      base.OnPropertyChanged(e); 
      if (e.Property == DynamicVerticalOffsetProperty) 
      { 
       if (ScrollInfo != null) 
        ScrollInfo.SetVerticalOffset(DynamicVerticalOffset); 
      } 
      else if (e.Property == DynamicHorizontalOffsetProperty) 
      { 
       if (ScrollInfo != null) 
        ScrollInfo.SetHorizontalOffset(DynamicHorizontalOffset); 
      } 
      else if (e.Property == HorizontalOffsetProperty) 
      { 
       DynamicHorizontalOffset = (double)e.NewValue; 
      } 
      else if (e.Property == VerticalOffsetProperty) 
      { 
       DynamicVerticalOffset = (double)e.NewValue; 
      } 
      else if (e.Property == ViewportWidthProperty) 
      { 
       DynamicViewportWidth = (double)e.NewValue; 
      } 
      else if (e.Property == ViewportHeightProperty) 
      { 
       DynamicViewportHeight = (double)e.NewValue; 
      } 
     } 
    } 
}