2012-06-08 4 views
0

부모 개체의 속성을 사용하여 목록 상자 항목 템플릿에서 바인딩 가시성에 문제가 있습니다. 다음은 사용자 정의 XAML 스타일의 템플릿에서 작은 조각은 다음과 같습니다부모 클래스 속성에 대한 Silverlight 바인딩 가시성

<!-- DATA BINDING ITEM TEMPLATE --> 
<StackPanel Orientation="Vertical"> 
    <TextBlock Height="19" 
     .... 
     Text="{Binding InfoTop}"/> 
    <Rectangle Height="1" 
     .... 
     Visibility="{Binding _linesVisibility[0], RelativeSource={RelativeSource AncestorType=my:PatientsList}}"/> 
    <TextBlock Height="19" 
     .... 
     Text="{Binding InfoMiddle}" 
     Visibility="{Binding _linesVisibility[0], ElementName=patientsControl}"/> 
    <Rectangle Height="1" 
     .... 
     Visibility="{Binding _linesVisibility[1]}"/> 
    <TextBlock Height="19" 
     .... 
     Text="{Binding InfoBottom}" 
     Visibility="{Binding _linesVisibility[1]}"/> 
</StackPanel> 

나는 코드 파일에 ItemsSource를 지정하여 텍스트 값을 바인딩 관리하지만 난 가시성을 바인딩 할 수 없습니다. 당신이 볼 수 있듯이 나는 다른 아이디어를 시도했지만 그들 중 누구도 일하지 않았습니다.

사용자 정의 컨트롤에 공용 변수 public Visibility[] _linesVisibility = new Visibility[2];이 있습니다. 이 컨트롤에는 위와 같이 사용자 지정 스타일이있는 목록 상자가 포함되어 있습니다. 내 _linesVisibility를 listbox-item 스타일에 제대로 바인딩하는 방법?

답변

0

당신은 배열에 직접 바인딩 할 수 없습니다 :이 작동하지 않습니다

Visibility="{Binding _linesVisibility[1]}" 

.

당신은 속성에 바인드해야하고 클래스는 INotifyPropertyChanged를 구현해야합니다 :

private Visibility backingVariable; 
public Visbilility PublicProperty 
{ 
    get { return backingVariable; } 
    set 
    { 
     backingVariable = value; 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs("PublicVariable")); 
     } 
    } 
} 

그것은 유형 Visibility의 속성 일 필요는 없습니다. 그것은 Visibility를 반환하는 변환기를 통해만큼 당신이 바인딩으로 모든 유형이 될 수 있습니다 :

public class BoolToVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     bool visibility = (bool)value; 
     return visibility ? Visibility.Visible : Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     Visibility visibility = (Visibility)value; 
     return (visibility == Visibility.Visible); 
    } 
} 

사용법 :

<UserControl.Resources> 
    <globalConverters:BoolToVisibilityConverter x:Key="boolToVisibilityConverter" /> 
</UserControl.Resources> 
: 컨버터는 다음과 같이 XAML에 선언

Visibility="{Binding SomeBoolean, Converter={StaticResource boolToVisibilityConverter}}" 

관련 문제