2013-09-02 1 views
0

Rectangle을 사용하여 간단한 누적 막대를 표시하는 WPF 사용자 정의 컨트롤을 만듭니다. 데이터는 컬렉션에 바인딩 할 수 있도록 뷰 모델의 DependencyProperty에 의해 제공됩니다. 이 모델은 다음과 같다 :WPF를 사용하여 막대를 그리는 viewmodel 공개

public class BarPart { 
    public Color Color { get; set; } 
    public int Size { get; set; } 
} 

의도를 나타내는 결합 가짜 폭보기 :

<ItemsControl ItemsSource="{Binding ElementName=Root, Path=Data}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel Orientation="Horizontal"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Rectangle Width="{Binding TotalSize/Size * Root.Width}" Height="30"> 
       <Rectangle.Fill> 
        <SolidColorBrush Color="{Binding Color}" /> 
       </Rectangle.Fill> 
      </Rectangle> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

코스의 크기는 디스플레이에 사용되는 장치가 아닌, 그것이 어떤 숫자가 될 수있다. 즉, Size에 직접 바인딩 할 수 없습니다. 그러나 스택 된 막대의 전체 너비는 사용자 정의 컨트롤의 너비에 걸쳐 있어야합니다. 바운드 크기는 크기, 문제의 BarPart 크기 및 컨트롤의 전체 너비의 합계를 사용하여 계산해야합니다.

MVVM은 뷰 모델 뷰에 대해 아무것도 몰라한다 지시한다. 그렇다면 이러한 계산과 전환은 어디에서 발생해야합니까? 이 결합 된 모든 BarPart 크기의 을 모르는 및 단위를 표시하는 변환 할 UserControl을의 전체 폭을 알 수 없기 때문에

IValueConverter은 수학을 할 수 없습니다.

엄격한 MVVM을 수행하는 다른 옵션이 무엇인지 잘 모르겠습니다.

<Binding Path="Size"/> 
<Binding ElementName="Root" Path="DataContext.TotalSize"/> 
<Binding ElementName="Root" Path="ActualWidth"/> 

TotalSize을 계산한다 막대를 포함하는 뷰 모델 :

+0

'DependencyProperty in the viewmodel' - [DependencyProperties는 ViewModels에 속하지 않음] (http://kentb.blogspot.com.ar/2009/03/view-models-pocos-versus.html)) –

+0

@HighCore 그 점을 지적 해 주셔서 감사합니다. 그것은 내 부분에 대한 나쁜 결정입니다. 그러나 POCO를 계속가는 것은 내가 계획 한 문제를 해결하지 못할 것이다. 그것에 관한 어떤 생각? –

+1

이상하지만 도메인이 시장 유동성이라는 점을 제외하고는이 * 정확한 * 문제를 수행해야했습니다. 컨트롤에는 VM이 ​​바인딩 된 유동성 컨텍스트가 있으며 컨트롤은 백분율 계산을 수행했습니다. 하지만 그 이유는 각 사각형에 도구 팁 등이 있어야했기 때문입니다. –

답변

1

당신은 계산기와 MultiBinding을 사용할 수, 바인딩은 같은 것을 할 것이다.

(막대의 Size이 변경되면 TotalSize에 대한 속성 변경 이벤트를 발생시킬 수 있도록 모든 막대의 속성 변경 사항을 구독해야합니다.) 물론 바가 추가/제거되면)

관련 문제