2013-08-28 2 views
0

모델을 그리는 데 필자 자신의 Panel (WPF)을 쓰고 있습니다. Model-DependencyProperty가 있고 모델에 대한 변경 사항이 LayoutProcess에 영향을 주길 원합니다.DependencyProperty가 LayoutProcess를 트리거하지 않습니다.

ModelProperty = DependencyProperty.Register("Model", typeof(Model), typeof(ModelPanel), 
      new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsMeasure)); 

변경 사항이 LayoutProcess에 적용되도록 모델 클래스를 구현해야합니까? 나는 INotifyPropertyChanged를 시도했다. 그러나 그것은 효과가 없었습니다.

+1

다른 것은 필요하지 않습니다. 'FrameworkPropertyMetadataOptions.AffectsMeasure'를 설정하면 속성이 변경 될 때마다 새로운 레이아웃주기가 생깁니다. – Clemens

+0

@Clemens하지만 그는 모델을 사용하고 있기 때문에 변경되는 ModelProperty가 아니라 변경되는 ModelProperty.Properties를 사용할 것입니다. – AlSki

+0

예 알아요. int, double 및 string을 DP-Type으로 사용하면 작동합니다. 그러나 Model은 객체이며 DependencyProperty가 어떻게 작동하는지 모르고이 객체가 변경되었음을 인식합니다. 내 패널이 내 PropertyChangedHandler에 등록하지 않습니다 (INotifyPropertyChanged 사용) – Phoenix

답변

1

죄송합니다.하지만이 방법을 잘못 생각한 것 같습니다.

WPF에서는 패널이 배치되는 방식을 정의하기 만합니다.

  • StackPanel은 가로 또는 세로로 차례대로 배치합니다.
  • WrapPanel은 행/열에서 물건을 배치 한 후 다음 행으로 배치합니다.
  • Canvas을 사용하면 x, y 지점에 배치 할 수 있습니다.

패널을 사용하려고하기 때문에 모델에 컬렉션이 있다고 가정합니다. 올바른 패널 유형을 제공 할 수있는 ListBox으로 컬렉션을 처리 할 수 ​​있습니다. 즉

<ListBox ItemsSource="{Binding MyThings}"> 
    <ListBox.ItemsPanel> 
     <StackPanel Orientation="Vertical"/> 
    </ListBox.ItemsPanel> 
</ListBox> 

그러나 이것은 일반적으로 단지 우리에게 클래스 이름의 목록을 제공, 당신의 것 중 하나가, 당신은 어떻게 표시하는 WPF 말할 필요하고,이를 위해 당신이 DataTemplate를 사용 나타내는 각각. 리소스 섹션 (컨트롤, 창 또는 응용 프로그램) 또는 필요한 곳에 여러 위치에서 정의 할 수 있습니다.

<ListBox ItemsSource="{Binding MyThings}"> 
    <ListBox.ItemsPanel> 
     <StackPanel Orientation="Vertical"/> 
    </ListBox.ItemsPanel> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Name}"/> <!-- Assuming each thing has a name property--> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

업데이트 : 아니면

<ListBox ItemsSource="{Binding MyThings}"> 
    <ListBox.ItemsPanel> 
     <Canvas/> 
    </ListBox.ItemsPanel> 
    <ListBox.Resources> 
     <DataTemplate TargetType="{x:Type MyLine}"> 
      <Line x1="{Binding Left}" x2="{Binding Right}" 
        y1="{Binding Top}" y2="{Binding Bottom}"/> 
     </DataTemplate> 
     <DataTemplate TargetType="{x:Type MyRectangle}"> 
      <Border Canvas.Left="{Binding Left}" Canvas.Right="{Binding Right}" 
        Canvas.Top="{Binding Top}" Canvas.Bottom="{Binding Bottom}"/> 
     </DataTemplate>   
    </ListBox.Resources> 
</ListBox> 

는 또한 Josh Smith's article on MVVM을 통해 읽기를 보여주기 위해 다른 유형의 항목이있는 경우, 거기에 예와 좋은 연습을 많이 가지고 있으며, 소개하는 모델을 깨끗하게 유지하는 패턴.

+0

문제는 내 모델에 목록이 없음입니다. 그것은 많은 대상을 가지고 있습니다. 이러한 객체는 화면 (직사각형, 선, 텍스트 등)에 그려야합니다. 내 모델의 개체를 변경하면이 모델의 다른 개체에 영향을줍니다. 따라서 한 객체의 변경은이 객체가 내 뷰에서 다시 그려지는 것 이상을 의미합니다. WPF를 사용할 수 없습니다. 내 모델이 동적으로 변경됩니다. – Phoenix

+0

목록에서 나는 많은 것을 의미하는 IEnumerable 을 의미합니다. 그래서 여전히 같은 패러다임이지만 캔버스가 당신이 찾고있는 것처럼 소리가납니다. 최신 업데이트보기 – AlSki

+0

Canvas를 사용하고 있는데 더 좋은 방법 인 것 같습니다. 내 개체 중 일부는 그룹화해야하므로 그리드에 배치하고이 그리드를 Canvas에 배치합니다. 일하는 것 같습니다. 감사. – Phoenix

관련 문제