2011-01-24 2 views
3

У меня есть окно с сеткой, действующей как форма. Окно не мое, и есть новое требование не показывать (т. Е. Свернуть) строки 4 и 5 на основе выбранного пользователем контекста.wpf данные привязки сетки видимость строки

две вещи, которые я могу думать о том, чтобы сделать эту работу либо:

  1. Имейте преобразователь на содержание строки, которая принимает логическое значение и коллапсирует видимость, если верно.
  2. Имейте конвертер на свойство высоты строки сетки.

Я предпочитаю последнее, но я не в состоянии получить входное значение для преобразователя. Код конвертера и привязка ниже.

Может ли кто-нибудь сказать мне, что должно быть обязательным, чтобы сделать эту работу? Есть ли более простой способ сделать это?

конвертер Код

[ValueConversion(typeof(GridLength), typeof(Visibility))] 
public class GridLengthToCollapseVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 

     if (value == null || parameter == null) return Binding.DoNothing; 

     var result = (GridLength) value; 
     bool shouldCollapse; 
     Boolean.TryParse(parameter.ToString(), out shouldCollapse); 
     return shouldCollapse ? new GridLength() : result; 

    } 

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

Оковы (это где я застрял)

Скажем, я хочу, чтобы значение высоты, чтобы быть 30, если связанный ShowLastName свойство не верно. Неправильная привязка ниже, но что такое?

<RowDefinition Height="{Binding Source=30, Converter={StaticResource GridLengthToCollapseVisibilityConv},ConverterParameter=ShowLastName}" /> 

Рабочий раствор

[ValueConversion(typeof(bool), typeof(GridLength))] 
public class GridLengthToCollapseVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 

     if (value == null || parameter == null) return Binding.DoNothing; 

     bool shouldCollapse; 
     Boolean.TryParse(value.ToString(), out shouldCollapse); 
     return shouldCollapse 
      ? new GridLength(0) 
      : (GridLength) parameter; 
    } 

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

}

<Grid.Resources> 
     <cvt:GridLengthToCollapseVisibilityConverter x:Key="GridLengthToCollapseVisibilityConv" /> 
     <GridLength x:Key="AutoSize">Auto</GridLength> 
     <GridLength x:Key="ErrorLineSize">30</GridLength> 
    </Grid.Resources> 

    <Grid.RowDefinitions> 
     <RowDefinition Height="{StaticResource AutoSize}" /> 
     <RowDefinition Height="{StaticResource ErrorLineSize}" /> 
     <RowDefinition Height="{Binding Path=HideLastName, 
      Converter={StaticResource GridLengthToCollapseVisibilityConv},ConverterParameter={StaticResource AutoSize}}" /> 
     <RowDefinition Height="{Binding Path=HideLastName, 
      Converter={StaticResource GridLengthToCollapseVisibilityConv},ConverterParameter={StaticResource ErrorLineSize}}" /> 
    </Grid.RowDefinitions> 
+0

Узнал что-то новое сегодня из вашего поста ... ValueConversion и Binding.DoNothing. Благодарю. – KornMuffin

ответ

2

Вы не можете привязка к ConverterParamater: http://social.msdn.microsoft.com/Forums/en/wpf/thread/88a22766-5e6f-4a16-98a6-1ab39877dd09

Почему бы не переключить значение и параметр, если высота всегда является такие же:

<RowDefinition Height="{Binding Source=ShowLastName, Converter={StaticResource GridLengthToCollapseVisibilityConv},ConverterParameter=30}" /> 

Если вам необходима привязка оба значения можно использовать многозначные привязки: http://msdn.microsoft.com/en-us/library/system.windows.data.imultivalueconverter.aspx

+0

Эй, спасибо за идею переключить значение и параметр, который упростил его реализацию. Вы можете связать конвертерParameter, хотя до тех пор, пока вы привязываетесь к DP (я делал это раньше). Ура! – Berryl

0

Все, что вам нужно сделать, это поменять Binding и параметры.


Если вы все еще хотите, чтобы оба значения были привязаны к базе данных, используйте MultiBinding, даже если ваше второе значение является константой. Это взломать, но это самый простой способ передать дополнительные значения в конвертер.

+0

btw - параметр не может быть привязан, поскольку это не DP, а не шанс. есть несколько трюков с расширениями разметки, но я бы не пошел по этому маршруту. –

Смежные вопросы