2010-12-01 11 views
3

레이블 label 및 BO public Person Person {get;set;}을 포함하는 MyUserControl이 있습니다.사용자 지정 바인딩 구현

나는 그 사람의 Name 항상이 같은 label에 결합 할 것을 원하는 : 경우에,

("Name: {0}", person.Name)의 경우 person != null

("Name: {0}", "(none)"), 경우에 경우 person == null

보다 더 사람 이름이 변경되면 레이블에서 자동으로 업데이트됩니다.

등이있을 수 있습니다. 바인딩?

"더러운"변형 :

private void label_LayoutUpdated(object sender, EventArgs e) 
{ 
    label.Content = string.Format("Name: {0}", _Person == null ? 
                 "(none)" : _Person.Name); 
} 

답변

1

이 문제는 값 변환기를 작성하여 해결할 수 있습니다.

[ValueConversion(typeof(Person), typeof(String))] 
public class PersonNameConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     Person person = value as Person; 
     if(person == null) 
     { 
      return "(none)"; 
     } 
     else 
     { 
      return person.Name; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

당신이를 만든 후에는 XAML에 리소스로 추가 할 수 있습니다 :

<local:PersonNameConverter x:Key="PersonNameConverter"/> 
다음

이 바인딩 매개 변수 중 하나에 포함 할 수

<TextBlock 
    Text="{Binding Path=ThePerson, Converter={StaticResource PersonNameConverter}}" 
    /> 
+0

바인딩이 "이름"속성 (NullorEmpty),하지만 사람 일에 대해 없습니다. – serhio

+0

@serhio : 제 잘못입니다. 그에 따라 코드를 변경했습니다. –

+0

Person 클래스에 제한이 있습니까? 그것은 INotifyPropetyChanged 또는 물건을 구현해야합니까? 내 BO 클래스가 단순한 것들이기 때문에 – serhio

3

방법 약 :

<StackPanel Orientation="Horizontal"> 
     <TextBlock Text="Name: "/> 
     <TextBlock Text="{Binding Person.Name, FallbackValue='(none)'}"/> 
    </StackPanel> 

레이블을 사용하지는 않지만 목표를 달성합니다. 이 레이블을 할 필요가있는 경우


, 당신은이 작업을 수행 할 수 있습니다 : 두 가지 접근 방식과

<Label Content="{Binding Person.Name, FallbackValue='(none)'}" 
      ContentStringFormat="Name: {0}"/> 

하나주의는 바인딩이 올바르지 (사람의 경우 텍스트도 Name: (none)를 표시 할 것입니다 == 널 (null) 속성 Person이 발견되지 않는 것과 동등한 동작입니다.

+0

+1 완벽한 답변. FallbackValue에 대해 알지 못했습니다. – Liz

+0

'ContentStringFormat'에 대한 +1 – serhio

+0

케이스의 Person.Name이 INotifyPropertyChanged를 구현해야합니까? – serhio

0

는 사용이 FallBackValue 속성

 <Lable Content ="{Binding Person.Name, FallbackValue='(none)'}"/> 
+0

이것은 Person.Name이 bindable 일 수 있음을 암시합니다 ... BO를 위해 반드시 필요하지는 않습니다 ... – serhio

관련 문제