WPF 데이터바인딩 실습, 사용자정의 엘리먼트와 스크롤바 데이터 바인딩
n 비주얼 스튜디오 -> WPF 응용프로그램 -> 프로젝트명 : CustomElementBinding
n MyElement.cs(사용자 정의 Element)
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Media;
namespace CustomElementBinding
{
/// //////////////////////////////////////////////////////////////
// Number라는 double 타입의 프로퍼티를 정의하고
// 이 프로퍼티는 NumberProperty라는 의존 프로퍼티의 지원을 받는다
// FrameworkPropertyMetadata는 초기값 이이며, 프로퍼티에 변화가 생기면
// OnRender를 호출하여 화면을 갱신(Number 프로퍼티를 노출)한다.
//////////////////////////////////////////////////////////////////
public class MyElement : FrameworkElement
{
// 의존 프로퍼티 선언
// 데이터 바인딩 통보 메커니즘은 이를 통해 저절로 확보된다.
public static DependencyProperty NumberProperty;
// static 생성자를 통한 의존 프로퍼티 생성
static MyElement()
{
NumberProperty =
DependencyProperty.Register("Number", typeof(double),
typeof(MyElement),
new FrameworkPropertyMetadata(0.0,
FrameworkPropertyMetadataOptions.AffectsRender));
}
// DependencyProperty를 CLR 프로퍼티로 노출
public double Number
{
set { SetValue(NumberProperty, value); }
get { return (double)GetValue(NumberProperty); }
}
// MeasureOverride를 오버라이딩해 Size를 리턴하는데 원래 이함수는 자식
// 엘리먼트를 돌면서 크기를 계산하고 업데이트하는 메소드 이다.
// 이함수를 재정의 안하면 자식 컨트롤의 크기가 이상해 질 수 있다.
// MyElement의 크기를 측정해서 FrameworkElement 파생클래스(MyElement)
// 의 Size를 리턴하는 것이다.레이아웃을 만들 때 자동으로 호출된다.
protected override Size MeasureOverride(Size sizeAvailable)
{
return new Size(200, 50);
}
// Number 프로퍼티를 보여주는 OnRender
protected override void OnRender(DrawingContext dc)
{
dc.DrawText(
new FormattedText(Number.ToString(),
CultureInfo.CurrentCulture, FlowDirection.LeftToRight,
new Typeface("Times New Roman"), 12,
SystemColors.WindowTextBrush),
new Point(0, 0));
}
}
}
|
n MainWindow.xaml
<Window x:Class="CustomElementBinding.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:src="clr-namespace:CustomElementBinding"
Title="Custom Element Binding" Height="350" Width="525">
<StackPanel>
<!-- 처음 스크롤바는 MyElement의 Number 프로퍼티와 OneWayToSource 바인딩을 하므로 스크롤바의 값이 바뀌면 MyElement의 Number 속성도 바뀐다. 이때 아래쪽은 두번째 스크롤바의 Value 프로퍼티와 MyElement가 TwoWay로 바인딩 되었으므로 두번째 스크롤바도 같이 움직인다.-->
<ScrollBar Orientation="Horizontal"
Margin="24"
Maximum="100"
LargeChange="10"
SmallChange="1"
Value="{Binding ElementName=simple, Path=Number,
Mode=OneWayToSource}" />
<!--
x:Name 속성은 FrameworkElement를 성속받지 않은 XAML 엘리먼트를 위한
속성이다. MyElement가 동일 어셈블리상이므로 Name대신 x:Name사용
-->
<src:MyElement x:Name="simple"
HorizontalAlignment="Center" />
<!-- 두번째 스크롤바를 움직이면 MyElement의 Number 속성도 바뀌지만
이 값이 바뀐다고 이것이 첫번째 스크롤바와는 바인딩 되지 않으므로
첫번째 스크롤바는 그대로 있다. -->
<ScrollBar Name="scroll"
Orientation="Horizontal"
Margin="24"
Maximum="100"
LargeChange="10"
SmallChange="1"
Value="{Binding ElementName=simple, Path=Number,
Mode=TwoWay}" />
<src:MyElement HorizontalAlignment="Center"
Number="{Binding ElementName=scroll, Path=Value,
Mode=OneWay}" />
</StackPanel>
</Window>
|
n 실행 결과
댓글 없음:
댓글 쓰기