programing

WPF에서는 Binding과 마찬가지로 TemplateBinding이 동작하지 않는 이유는 무엇입니까?

goodsources 2023. 4. 11. 21:59
반응형

WPF에서는 Binding과 마찬가지로 TemplateBinding이 동작하지 않는 이유는 무엇입니까?

좋아... 머리 긁히는 것 같아2개의 WPF 컨트롤이 있습니다.하나는 사용자 컨트롤이고 다른 하나는 커스텀 컨트롤입니다.User Foo와 Custom Foo라고 부릅니다.Custom Foo용 컨트롤 템플릿에서는 User Foo 인스턴스를 사용하고 있습니다.User Foo는 이름 있는 부품이기 때문에 템플릿 적용 후 접근할 수 있습니다.잘 먹히네요.

현재 UserFoo와 CustomFoo 모두Text정의된 속성(즉, AddOwner를 사용하는 공유 DP가 아님)입니다.Don't quest...) 둘 다 이렇게 선언되어 있습니다.

public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
    "Text",
    typeof(string),
    typeof(UserFoo), // The other is CustomFoo
    new FrameworkPropertyMetadata(
        null,
        FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
        null,
        null,
        true,
        UpdateSourceTrigger.PropertyChanged
    )
);

특히 모드가 TwoWay로 설정되고 UpdateSourceTrigger가 PropertyChanged로 설정된다는 점에 유의하십시오.

Custom Foo 스타일템플릿에서 Custom Foo의 Text 속성을 내부 User Foo의 Text 속성에 소스로서 바인드합니다.보통 이건 쉬워요.UserFoo의 텍스트 속성을 "{TemplateBinding Text}"로 설정했을 뿐인데, 어떤 이유로 인해 UserFoo가 CustomFoo에서 올바르게 설정되었지만 그 반대는 설정되지 않았습니다. 다시 말하지만 두 DP는 모두 양방향으로 설정됩니다!단, 템플릿바인딩이 아닌 상대 소스바인딩을 사용하는 경우에는 매우 효과적입니다.어... 뭐야?

// This one works
Text="{Binding Text, RelativeSource={RelativeSource AncestorType={local:CustomFoo}}, Mode=TwoWay}"

// As does this too...
Text="{Binding Text, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"

// But not this one!
Text="{TemplateBinding Text}"

그래서 무슨 일이야?제가 무엇을 빠뜨리고 있나요?

MSDN에서 다음 포럼 투고를 찾았습니다.http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/0bb3858c-30d6-4c3d-93bd-35ad0bb36bb4/

다음과 같이 되어 있습니다.

TemplateBinding은 템플릿시나리오용으로 최적화된 형식의 바인딩으로,

{Binding RelativeSource={RelativeSource TemplatedParent}}

OP 메모: 매뉴얼에 기재되어 있는 내용과 달리 실제로는 다음과 같습니다.

{Binding RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}

나는 그 문서들을 고소했고, 그들은 그들이 항상 일방적이라는 문장을 추가했지만, 코드 예제는 여전히 모드를 나열하지 않지만, 없는 것보다는 낫다고 생각한다.)

TemplateBinding은 템플릿에 바인딩된 상위 템플릿에서 속성으로 데이터를 전송합니다.반대 방향 또는 양방향으로 데이터를 전송해야 하는 경우 Mode 특성이 OneWayToSource 또는 TwoWay로 설정된 RelativeSource of TemplatedParent와의 바인딩을 작성합니다.

상세내용 : http://msdn.microsoft.com/en-us/library/ms742882.aspx

Mode=OneWay는 TemplateBinding 사용의 "최적화" 중 하나인 것 같습니다.

TemplateBinding은 양방향 바인딩을 지원하지 않으며 Binding만 지원합니다.BindsTwayBeDefault 옵션을 사용하더라도 양방향 바인딩을 지원하지 않습니다.

자세한 내용은 여기를 참조해 주세요.요약:

단, TemplateBinding은 TemplateBinding을 사용하는 부모에서 요소로 데이터를 전송할 수 있는 방향만 있습니다.데이터를 반대방향 또는 양방향으로 전송해야 할 경우 RelativeSource of TemplatedParent가 유일한 옵션입니다.예를 들어, 템플릿 내에서 TextBox 또는 Slider와 상호 작용하면 양방향 바인딩을 사용하는 경우에만 템플리트 상위 템플릿의 속성이 변경됩니다.

언급URL : https://stackoverflow.com/questions/5913176/in-wpf-why-doesnt-templatebinding-work-where-binding-does

반응형