2010-06-17 1 views
1

를 업데이트하지 바인딩 XAML 파일의 맨 마지막으로종속성 속성 내가 지정 종속성 속성을 대상

  x:Name="main" 

,이 생성자가 :

public RadAdjustableSlider() 
    { 
     InitializeComponent(); 
     this.Header = "Header"; 
    } 

이 컨트롤을 다른 부모 컨트롤 안에 넣으면 머리글 텍스트 블록이 비어 있습니다. 왜?

편집 : This blog이 작업을 수행하려면 올바른 방법은 DependencyProperty.Register 호출에 ValidateValueCallback을 제공함으로써라고 말한다, 그러나 그것은 배관의 꽤 많은 것 같아 외부 컨트롤과 상호 작용할 때 종속성 속성이 작동하는 방식을 설명하지 않습니다. 내 모든 종속성 속성에 대해 콜백 함수를 작성해야할까요?

+0

이전 답변. 방금 다시 질문을 읽었습니다. 설정이 잘못 이해 된 것 같습니다. Custom DP가 Main.Xaml 클래스에 정의되어 있습니까? –

+0

@Foovanadil DP는 RadAdjustableSlider.xaml.cs에 정의되어 있습니다. "주"요소는 RadAdjustableSlider : UserControl입니다. – Jake

답변

1

는 이미 프레임 워크에서 HeaderedContentControl 및 HeaderedItemsControl ...

있습니다하지만 당신이 정말로 당신의 자신을 만들려면 당신은 아마 TemplateBinding을 사용해야합니다. 대신 다음과 같이 시도하십시오.

class MyHeaderedControl : ContentControl 
{ 
    public static readonly DependencyProperty HeaderProperty = DependencyProperty.Register(
    "Header", 
    typeof(object), 
    typeof(MyHeaderedControl), 
    new PropertyMetadata()); 

    public MyHeaderedControl() 
    { 
    this.DefaultStyleKey = typeof(MyHeaderedControl); 
    } 
} 

그런 다음 프로젝트에서 "\ Themes \ Generic.xaml"에 파일을 만듭니다. 이것은 특별히 명명 된 파일이며 프로젝트 루트에서 테마 폴더에 있어야합니다. ResourceDictionary가 있어야합니다. 당신의 AssemblyInfo.cs이 속성을 추가로

<ResourceDictionary 
    xmlns="..." 
    xmlns:x="..." 
    xmlns:c="MyControlLibrary1" 
    > 
    <Style TargetType="{x:Type c:MyHeaderedControl> 
    <Setter Property="Template"> 
     <Setter.Value> 
     <ControlTemplate TargetType="{x:Type c:MyHeaderedControl}"> 
      <StackPanel> 
      <ContentControl Content="{TemplateBinding Header}" /> 
      <ContentPresenter /> 
      </StackPanel> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    </Style> 
</ResourceDictionary> 

또한, 이미 아니라면 : 개요에 대한 그래서

[assembly: ThemeInfo(ResourceDictionaryLocation.SourceAssembly, 
     ResourceDictionaryLocation.SourceAssembly)] 

. 일반적인 생각은 속성과 이벤트 및 로직 등이있는 몇 가지 유형의 논리적 컨트롤을 만드는 것입니다. 그런 다음 동일한 어셈블리에서 기본 테마를 제공합니다. 이것이 컨트롤이 기본적으로 표시되는 방법입니다. 컨트롤이 사용되는 모든 위치에서 기본 템플릿을 재정의하고 특정 템플릿을 평소대로 재정의 할 수 있습니다.

이렇게 사용자 설정 컨트롤에 이와 같은 맞춤 콘텐츠를 추가 할 수 있습니다. 한 번 시도해 보면 의미가 있고 울퉁불퉁하지 않을 것입니다. 더 많은 제어를하면 Generic.xaml 파일에 계속 추가하십시오.

+0

제 질문은 사용자 지정 컨트롤의 자식을 컨트롤의 사용자 지정 속성에 바인딩하는 일반적인 문제와 더 관련이 있습니다. 예 : 같은 격자에'TextBox'와'RadAdjustableSlider'를 가지고 있다면 Header 바인딩은 예상대로 작동하지만'TextBox'가'RadAdjustableSlider'의 일부로 정의되면 작동하지 않습니다. 따라서 "머리글"측면은 관련성이 없습니다. 더 일반적인 문제에 대한 구체적인 예를 제공하는 것일뿐입니다. 노력 해줘서 고맙겠지 만 ~ 20 줄의 배관을 요구할 때 솔루션은 사용자 정의 컨트롤을 사용하여 모듈화하는 목적의 일부를 무효화합니다. – Jake

+0

WPF는 간결한 것으로 알려져 있지 않습니다 ... 나는 여전히 이것이 "적절한"방법이라고 생각합니다. –

0

위의 justin.m.chase처럼 사용자 정의 컨트롤이 아마도 가장 좋은 방법 일 것이지만 UserControls는 일반적인 시나리오이므로 2c를 추가 할 것입니다.

UserControl은 DataContent 속성을 설정하지 않으므로 UserControl XAML 내의 모든 바인딩이 컨트롤을 배치 한 DataContent로 확인됩니다.

이 동작을 변경하거나 사용자의 UserControl을 생성자 내부의 DataContext 속성을 설정하려면 :

public RadAdjustableSlider() 
{ 
    InitializeComponent(); 
    this.Header = "Header"; 

    this.DataContext = this; 
} 

다음과 같이 바인딩 :

<TextBlock Text="{Binding Header}" /> 

또는 DataContext를 설정하지 않고 다음과 같이 결합 :

<TextBlock Text="{Binding Header, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ns:RadAdjustableSlider}}}" />