2011-11-16 5 views
0

간단한 문제가 있습니다. 콤보 상자에 종속성 속성을 추가하려고합니다. 콤보 상자가 처음 표시 될 때 그 값을 표시 할 수 있어야합니다. ComboBox 내에 TextBlock이있는 ContentPresenter가 있습니다. 사용자가 ComboBox에서 항목을 선택하면 해당 TextBlock이 설정됩니다. 기본 값 (항목 중 하나가 아님)으로 어떻게 설정할 수 있습니까? '하나 선택'과 같은 것을 보여주십시오.Silverlight에서 컨트롤 (ComboBox) 확장하기

'DefaultDisplay'종속성 속성을 사용하여 ComboBox를 확장 할 수 있지만이 속성을 제어 템플릿의 일부인 TextBlock에 어떻게 연결합니까?

감사합니다. 대신에 나는이 작업을 수행하는 동작을 사용하는 것이 좋습니다 것 종속성 속성의

답변

0

. 나는 실제로이 문제에 대해 이미 쓰여진 것들 중 하나를 가지고있다. 행동에 PromptText 속성을 당신의 콤보 상자에 추가하고 설정하여 그것을 시도 보내기

public class ComboBoxPromptBehavior : Behavior<ComboBox> 
{ 
    [Category("Display")] 
    public string PromptText 
    { 
     get { return (string)GetValue(PromptTextProperty); } 
     set { SetValue(PromptTextProperty, value); } 
    } 

    public static readonly DependencyProperty PromptTextProperty = DependencyProperty.Register("PromptText", typeof(string), typeof(ComboBoxPromptBehavior), new PropertyMetadata(" ")); 

    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     AssociatedObject.Loaded += new RoutedEventHandler(AssociatedObject_Loaded); 
     AssociatedObject.LayoutUpdated += new EventHandler(AssociatedObject_LayoutUpdated); 
    } 

    void AssociatedObject_LayoutUpdated(object sender, EventArgs e) 
    { 
     SetPromptText(); 
    } 

    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 
     AssociatedObject.Loaded -= new RoutedEventHandler(AssociatedObject_Loaded); 
     AssociatedObject.LayoutUpdated -= new EventHandler(AssociatedObject_LayoutUpdated); 
    } 

    void AssociatedObject_Loaded(object sender, RoutedEventArgs e) 
    { 
     SetPromptText(); 
    } 

    private void SetPromptText() 
    { 
     var textbox = AssociatedObject.FindChild<TextBlock>(); 
     if (textbox != null && string.IsNullOrWhiteSpace(textbox.Text)) 
     { 
      textbox.Text = PromptText; 
     } 
    } 
} 

그리고 FindChild의 확장 방법은 다음과 같습니다

public static T FindChild<T>(this DependencyObject element) where T : DependencyObject 
{ 
    var childCount = VisualTreeHelper.GetChildrenCount(element); 

    for (int i = 0; i < childCount; i++) 
    { 
     var child = VisualTreeHelper.GetChild(element, i); 
     if (child is T) 
     { 
      return (T)child; 
     } 
     var match = child.FindChild<T>(); 
     if (match != null) return match; 
    } 

    return null; 
} 
+0

내 시스템이 동작 발견되지 않습니다. 연구 결과에 따르면 Microsoft.Expression.Interactivity에있을 수 있지만 실패한 것 같습니다. –

+0

예, Expression Blend SDK에 있습니다. http://www.microsoft.com/download/en/details.aspx?displaylang=ko&id=3062 – Bryant

관련 문제