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> 

мне удалось связать значение Text, присвоив 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); 
    } 
} 

Использование:

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

где преобразователь объявлен в XAML как это:

<UserControl.Resources> 
    <globalConverters:BoolToVisibilityConverter x:Key="boolToVisibilityConverter" /> 
</UserControl.Resources> 
Смежные вопросы