Изменение внешнего вида коллекции элементов в соответствии с одним свойством в XAML - PullRequest
1 голос
/ 05 июля 2010

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

В настоящее время я сделал это в коде позади, чтобы, когда этоконкретные свойства изменяются, он отключает все, кроме одного, в зависимости от значения.Это работает, но я действительно не люблю помещать подобные вещи в код.Должен быть способ сделать это в xaml?

Я мог бы создать собственный стиль для всех четырех кнопок, а затем сделать это с помощью триггеров данных, но я бы предпочел более общий подход: использовать один и тот же стиль для всех кнопок, которые каким-то образомприменяется по-разному в зависимости, например, от имени кнопки и значения свойства.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 05 июля 2010

Вы можете создать связь между enum, который вы создали, и кнопками, имея целочисленные ссылки на значения перечисления и задавая эти значения перечисления как ConverterParameters для соответствующих кнопок.

Например:

Перечисление:

public enum myOptions
{
    value1 = 1,
    value2 = 2,
    value3 = 3,
    value4 = 4
}

Переплет:

<Button IsEnabled = {Binding Path=myProperty, 
                             Converter = {StaticResource EnumToBoolConverter}, 
                             ConverterParameter = 1} />
<Button IsEnabled = {Binding Path=myProperty, 
                             Converter = {StaticResource EnumToBoolConverter}, 
                             ConverterParameter = 2} />

И преобразователь:

public class EnumToBoolConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (int)value == (int)parameter;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}
1 голос
/ 05 июля 2010

Вы можете использовать MultiBinding для привязки свойства IsEnabled к комбинации имени элемента управления и свойства из вашего DataContext и создать стиль, чтобы применить его ко всем кнопкам в сетке:

<Grid.Resources>
    <local:EqualsConverter x:Key="EqualsConverter"/>
    <Style TargetType="Button">
        <Setter Property="IsEnabled">
            <Setter.Value>
                <MultiBinding Converter="{StaticResource EqualsConverter}">
                    <Binding RelativeSource="{RelativeSource Self}" Path="Name"/>
                    <Binding Path="EnabledButtonName"/>
                </MultiBinding>
            </Setter.Value>
        </Setter>
    </Style>
</Grid.Resources>

И в коде:

public class EqualsConverter
    : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return values.Length == 2 && object.Equals(values[0], values[1]);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }
}
...