2014-05-22 2 views
2

에 비 종속성 개체에 한 바인딩 : 나는 XAML의 문은 다음과 같이 실버

<my:CMIconText Icon="Attachment" Text="Logo" /> 

는 CMIconText이 클래스는 abc.Core.dll 어디에서 오는 및 텍스트는 그 클래스의 문자열 속성입니다.

정적 바인딩을 사용하여 텍스트를 바인딩하고 싶지만 "텍스트"는 종속성 속성이 아니기 때문에 그렇게 할 수 없습니다. 문제는 다른 여러 프로젝트에서 abc.Core.dll을 사용하고 있기 때문에 종속성 속성으로 만들 수 없다는 것입니다.

dll을 변경하지 않고 속성을 바인딩 할 수있는 다른 대안이 있습니까?

감사합니다,

압디

답변

0

당신은 바인딩을보고 당신이 객체 CMIconText에 정적으로 값을 전달하는 개체에 연결된 종속성 속성을 사용할 수 있습니다. OneWay Y 인딩을 사용하면 더 잘 작동하지만 양방향 Y 인딩을 수행 할 수 있습니다.

public class TextBoxExtension 
{ 
    public static readonly DependencyProperty AttachedTextProperty; 

    static TextBoxExtension() 
    { 
     AttachedTextProperty = DependencyProperty.RegisterAttached("AttachedText", typeof (string), typeof (TextBoxExtension), new PropertyMetadata(default(string), TextAttachedChanged)); 
    } 

    public static string GetAttachedText(TextBox sender) 
    { 
     return (string) sender.GetValue(AttachedTextProperty); 
    } 

    public static void SetAttachedText(TextBox sender, string value) 
    { 
     sender.SetValue(AttachedTextProperty, value); 
    } 

    private static void TextAttachedChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
    { 
     ((TextBox) sender).Text = e.NewValue as string; 
    } 
} 

이것은 당신이 XAML에서 그렇게 할 수 있습니다 :이 전체 클래스를 재 구현보다 훨씬 간단

<TextBox Grid.Row="0" Grid.Column="1" controls:TextBoxExtension.AttachedText="{Binding Name}" /> 

. 물론 TextBox의 참조를 자신의 개체로 변경해야합니다. 그러나 나는 그것을 가지지 않았기 때문에 당신에게 모범을 줄 수있는 가장 가까운 곳이었습니다.

0

속성과 동작이 비슷한 별도의 클래스를 만들지 만 필요한 경우 종속성 속성을 사용합니다. CMIconText을 확장 할 수도 있습니다 (특히 Text 속성을 재정의하여 새 구현을 제공 할 수있는 경우 기본 속성을 DP로 변경하는 것이 좋지 않더라도 virtual으로 수정할 수 있음) . 나는 기초가있을 수없는 경우에 종류를 확장하는 것을 피할 것입니다 Textvirtual 일 수있다. 이 경우 클래스를 완전히 분리하고 적절한 방법 (또는 AutoMapper)을 사용하여 /에서 CMIconText으로 변환하십시오.

public class SilverlightCMIconText : CMIconText 
{ 
    public override string Text 
    { 
     get { ... } 
     set { ... } 
    } 
} 
<local:SilverlightCMIconText Icon="Attachment" Text="{StaticResource Whatev}" /> 
관련 문제