Видимость строк сетки привязки данных wpf - PullRequest
3 голосов
/ 24 января 2011

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

Две вещи, которые я могу придумать для выполнения этой работы:

  1. Иметь конвертер для содержимого строки, который принимает bool и сворачивает видимость, если true.
  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 не имеет значение true.Приведенная ниже привязка неверна, но что это?

 <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>

Ответы [ 2 ]

2 голосов
/ 24 января 2011

Вы не можете привязать данные к 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 голосов
/ 24 января 2011

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


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...