2013-07-13 2 views
3

나는 사용자 정의 컨트롤이 있습니다. 내 사용자 정의 컨트롤에 바인딩 가능한 속성을 만들고 싶습니다. 다음과 같이 내가하는 DependencyProperty를 만들 :WPF에서 바인딩 가능한 속성을 만드는 방법은 무엇입니까?

public static readonly DependencyProperty DateProperty = 
    DependencyProperty.Register("Date", typeof(DateTime), typeof(DaiesContainer), 
     new UIPropertyMetadata(DateTime.Now)); 

    public DateTime Date 
    { 
     get { return (DateTime)GetValue(DateProperty); } 
     set 
     { 
      SetValue(DateProperty, value); 
     } 
    } 

그때 나는 내 XAML에서 사용 :

<ctrls:DaiesContainer Date="{Binding Date, Mode=OneWay}"/> 

을 내 뷰 모델에서 날짜 속성의 get 메소드가 호출됩니다. 하지만 내 사용자 정의 컨트롤에서 날짜 속성은 값으로 설정되어 있지 않습니다.

+0

는 HTTP (A [호환 패턴]에 XAML에서'DateTime'를 삽입 : //msdn.microsoft.com/en-us/library/dd631811.aspx)? –

+0

속성이 설정되지 않았다는 것을 어떻게 알 수 있습니까? 종속성 속성의 메타 데이터로 [PropertyChangedCallback] (http://msdn.microsoft.com/en-us/library/system.windows.propertychangedcallback.aspx)을 등록하지 않았습니다. [여기] (http://msdn.microsoft.com/en-us/library/bb613563.aspx)에 설명 된대로 속성이 XAML에 설정되어 있으면 CLR 래퍼의 설정자가 호출되지 않습니다. – Clemens

+0

@Clemens 고맙습니다.하지만 정적이 아닌 메서드를 호출해야합니다. –

답변

2

귀하의 종속성 속성 구현은 속성 값이 변경되면 호출되는 PropertyChangedCallback이 없습니다. 콜백은 정적 메서드로 등록되어 현재 인스턴스 (속성이 변경된)를 첫 번째 매개 변수 (DependencyObject 유형)로 전달합니다. 아래에 나와있는 것처럼 인스턴스 필드 나 메소드에 액세스하려면 클래스 유형으로 변환해야합니다.

public static readonly DependencyProperty DateProperty = 
    DependencyProperty.Register("Date", typeof(DateTime), typeof(DaiesContainer), 
    new PropertyMetadata(DateTime.Now, DatePropertyChanged)); 

public DateTime Date 
{ 
    get { return (DateTime)GetValue(DateProperty); } 
    set { SetValue(DateProperty, value); } 
} 

private void DatePropertyChanged(DateTime date) 
{ 
    //... 
} 

private static void DatePropertyChanged(
    DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    ((DaiesContainer)d).DatePropertyChanged((DateTime)e.NewValue); 
} 

종속성 속성의 기본 값을 설정하는 것은 단지 클래스의 모든 인스턴스에 대해 한 번 수행하는 것도 유의하시기 바랍니다. 따라서 DateTime.Now 값을 설정하면 모든 기본값에 대해 동일한 기본값, 즉 DependencyProperty이 등록 된 시간이 생성됩니다. 나는 좀 더 의미있는, 아마도 DateTime.MinValue을 사용하는 것이 더 나은 선택 일 것이라고 생각한다. MinValue 새로 만든 DateTime 인스턴스의 기본값은 이미, 당신은 당신의 속성 메타 데이터에서 기본값을 생략 할 수 있습니다

public static readonly DependencyProperty DateProperty = 
    DependencyProperty.Register("Date", typeof(DateTime), typeof(DaiesContainer), 
    new PropertyMetadata(DatePropertyChanged)); 
0

는 바인딩 모드 양방향

<ctrls:DaiesContainer Date="{Binding Date, Mode=TwoWay}"/> 
+0

그것은 작동하지 않습니다. C#에서 날짜 속성에 값을 설정할 때 모든 것이 좋지만 xaml의 date 속성에 값을 설정하면 설정되지 않습니다. –

0

난 당신이 XAML의 UserControl에 오류가 있다고 생각을합니다.

당신은 당신이 DaiesContainer 클래스의 Date 속성에 바인딩이 경우 : 예컨대, ElementName에 의해

<UserControl x:Class="WPFProject.DaiesContainer" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300" 
      x:Name="daiesContainer"> 
    <Grid> 
     <DatePicker SelectedDate="{Binding Date, ElementName=daiesContainer}" /> 
    </Grid> 
</UserControl> 

을 결합해야한다. 컨테이너이 사용자 컨트롤의 DataContext

<DatePicker SelectedDate="{Binding Date}" /> 

UserControl을 DaiesContainer 의지 노력 찾기 재산 Date을하고,이 속성을 찾을 수 없습니다, 당신은 빈 선택 값으로 DatePicker 표시됩니다

당신은 ElementName없이 바인딩을 사용하는 경우 .

관련 문제