2011-12-14 2 views
6

다른 컨트롤 (예 : MyCustomButton)을 래핑하는 사용자 지정 컨트롤이 있다고 가정 해 봅니다. 나는 내부 통제 랩하는 속성 내용, 노출 :종속 종속성 속성

위해
public object Content 
    { 
     get { return innerControl.Content; } 
     set { innerControl.Content = value; } 
    } 

소비자가이 속성에 바인딩 할을, 나는 그것을 위해하는 DependencyProperty를 정의해야

public static DependencyProperty ContentProperty = DependencyProperty.Register("Content", typeof (object), typeof (MyCustomButton)); 

을하지만 지금은 필요

public object Content 
    { 
     get { return GetValue(ContentProperty); } 
     set { SetValue(ContentProperty, value); } 
    } 

그래서 난 더 이상 내부 컨트롤의 값을 포장하고 있지 않다 : 내 속성 정의는 GetValue/SetValue 매크로를 사용합니다.

PropertyMetadata를 정의하여 DependencyProperty의 PropertyChanged 이벤트를 처리 할 수 ​​있습니다. 그런 다음 값을 동기화 상태로 유지하고 변경시 무한 루프백을 방지하기 위해 일련의 배관 코드가 필요합니다.

업데이트 : 내 UserControl에는 여러 가지 다른 문제가 있으므로 Button에서 파생 될 수 없습니다.

더 좋은 방법이 있나요?

답변

2

글쎄, 사용자 컨트롤이있는 단추를 래핑하는 이유에 따라 단추에서 상속되는 사용자 지정 컨트롤을 정의 할 수 있습니다. 그런 다음 단추를 랩핑하고 원하는 랩핑 된 메소드 및 특성을 표시하는 대신, 사용자 정의 컨트롤을 정의하려는 작동을 갖는 메소드 및 특성을 간단히 대체 할 수 있습니다. 이렇게하면 휠을 재발 명할 필요없이 버튼의 모든 기능을 사용할 수 있습니다. 사용자 컨트롤이 다른 문제가있는 경우 http://knol.google.com/k/creating-custom-controls-with-c-net#

, 이것은 당신을위한 옵션이되지 않을 수도 있습니다,하지만 - 여기

그것을 통해 당신을 안내합니다 구글 링크입니다 (내가 발견 한 첫 번째 중 하나가 충분히 있습니다) 당신이 그것에 대해 언급 한 유일한 목적은 버튼을 감싸는 것이기 때문에 나는이 대답을 제시하고 있습니다. 개인적으로 사용자 정의 컨트롤을 만들고 사용자 컨트롤보다는 상속하는 것이 좋을 것입니다. 문제의 컨트롤이보다 구체적인 종류의 래핑/상속 된 컨트롤 (즉, 귀하의 경우에는 단추)이 될 경우에만 사용하십시오.

편집 : 업데이트 된 질문의 빛 ...

에서 당신은이 라인을 따라 뭔가를 할 수 있습니다. 여기

<Grid> 
    <local:MyControl ButtonContent="Click Me!"/> 
</Grid> 
</Window> 

사용자 컨트롤 자체에 대한 XAML된다 : 여기에 사용자 컨트롤의 클라이언트의 XAML은

<UserControl x:Class="GuiScratch.MyControl" 
      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" 
      xmlns:local="clr-namespace:GuiScratch" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 

     <StackPanel> 
      <ContentControl Content="Asdf"/> 
      <Button Content="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyControl}},Path=ButtonContent}"/> 
     </StackPanel> 

    </Grid> 
</UserControl> 

그리고, 여기 뒤에 코드 :

public partial class MyControl : UserControl 
{ 

    public static readonly DependencyProperty ButtonContentProperty = 
    DependencyProperty.Register("ButtonContent", typeof(object), typeof(MyControl), 
    new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender)); 

    public object ButtonContent 
    { 
     get { return (object)GetValue(ButtonContentProperty); } 
     set { SetValue(ButtonContentProperty, value); } 
    } 

    public MyControl() 
    { 
     InitializeComponent(); 
    } 
} 

그래서 코드를 통해 바인딩을 전혀 처리 할 필요가 없습니다. 클라이언트 컨트롤 자체의 XAML과 마찬가지로 클라이언트 XAML이 종속성 속성에 바인딩됩니다. 이 방식으로 이들은 종속성 속성 설정을 공유합니다. 나는 이것을 작은 스크래치 패드에서 돌렸고, 결과는 당신이 찾고있는 것 (적어도 내 이해)이다. 메인 윈도우는 "Asdf"텍스트와 "Click Me!"텍스트가있는 스택 패널로 사용자 정의 컨트롤을 표시합니다.

+0

사용자 정의 컨트롤에는 다른 문제가 있습니다. 업데이트 된 질문. – Jeff

+0

구체적으로 사용자 컨트롤의 "Content"속성을 사용 하시겠습니까?그렇지 않은 경우에는 항상 다른 종속성 속성을 노출하고 사용자 정의 컨트롤에있는 값을 해당 값에 바인딩 할 수 있습니다. –

+0

나는 그것이 무엇인지에 상관하지 않는다. 그러나 나는 재산의 가치가 내부 통제의 어떤 것에 구체적으로 묶여지기를 바랍니다. – Jeff