5

WinRT/Metro 응용 프로그램에 대한 사용자 지정 컨트롤을 개발하려고합니다.WinRT 사용자 지정 컨트롤 종속 속성 설정/바인딩

종속성 속성이 있으며 사용자 지정 컨트롤 내에서 해당 값을 설정할 수 있기를 원합니다. 그러나 SetValue를 사용하면 컨트롤의 소비자가 만들었던 모든 바인딩이 끊어집니다.

발견 된 해결책 (예 : SetCurrentValue)이 WinRT/Metro에 적용되지 않는 것 같습니다. 이것에 대한 해결책이 있습니까?

간단한 일처럼 들리지만 솔직히! - 여기와 다른 곳에서 해결책을 찾으려고 노력했습니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변

2

PropertyMetadata에서 기본값을 설정할 수 있습니다 (Dr. WPF의 snippets!).

#region IsAvailable 
private static bool DefaultIsAvailable = false; 

/// <summary> 
/// IsAvailable Dependency Property 
/// </summary> 
public static readonly DependencyProperty IsAvailableProperty = 
    DependencyProperty.Register(
     "IsAvailable", 
     typeof(bool), 
     typeof(CustomControl1), 
     new PropertyMetadata(DefaultIsAvailable, OnIsAvailableChanged)); 

/// <summary> 
/// Gets or sets the IsAvailable property. This dependency property 
/// indicates .... 
/// </summary> 
public bool IsAvailable 
{ 
    get { return (bool)GetValue(IsAvailableProperty); } 
    set { SetValue(IsAvailableProperty, value); } 
} 

/// <summary> 
/// Handles changes to the IsAvailable property. 
/// </summary> 
/// <param name="d"> 
/// The <see cref="DependencyObject"/> on which 
/// the property has changed value. 
/// </param> 
/// <param name="e"> 
/// Event data that is issued by any event that 
/// tracks changes to the effective value of this property. 
/// </param> 
private static void OnIsAvailableChanged(
    DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    var target = (CustomControl1)d; 
    bool oldIsAvailable = (bool)e.OldValue; 
    bool newIsAvailable = target.IsAvailable; 
    target.OnIsAvailableChanged(oldIsAvailable, newIsAvailable); 
} 

/// <summary> 
/// Provides derived classes an opportunity to handle changes 
/// to the IsAvailable property. 
/// </summary> 
/// <param name="oldIsAvailable">The old IsAvailable value</param> 
/// <param name="newIsAvailable">The new IsAvailable value</param> 
protected virtual void OnIsAvailableChanged(
    bool oldIsAvailable, bool newIsAvailable) 
{ 
} 
#endregion 

EDIT *

값을 변경하려면 - 할 수 있습니다,하지만 당신은 OneWay입니다 기본 바인딩을 사용하는 경우 - 예 - 그것은 바인딩 소스의 값을 취하고로 설정 종속성 속성 - 원본과 대상 값이 더 이상 동기화되지 않기 때문에 바인딩이 작동을 멈 춥니 다.

Mode="TwoWay"으로 설정하면 바인딩 대상 (사용자 컨트롤)이 종속성 속성을 수정할 때 바인딩 원본이 업데이트되므로 바인딩이 유효하고 두 방법으로 계속 작업 할 수 있습니다.

+0

당신의 대답은 가치를 설정하는 것이 바인딩을 깨뜨리는 것이라고 지적했습니다. 이것이 제가 질문 한 이유입니다. 내가 생각할 수있는 유일한 대안은 INotifyPropertyChanged를 구현하고 "일반"속성을 사용하는 것입니다. 그러나 사용자는이 속성에 바인딩 할 수 없습니다. –

+0

흠, 사실 - 혼란스러워. 모드를 TwoWay로 설정하면 바인딩이 중단되지 않습니다. –

+1

에 따라 http://msdn.microsoft.com/en-us/library/windows/apps/hh700353 바인딩은 종속성 속성 값 우선 순위를 위해 로컬 값으로 처리되므로 다른 로컬 값을 설정하면 원래 Binding 값을 보유한 속성에 바인딩을 제거합니다. 이것은 내가 겪고있는 것처럼 보이는 동작입니다. –

관련 문제