Есть ли способ использовать значения переменных и условия в Binding в XAML? - PullRequest
3 голосов
/ 27 декабря 2011

Я задам этот вопрос со ссылкой на конкретный пример. Я использую ScaleX и ScaleY для реализации увеличения и уменьшения масштаба в Canvas, код XAML:

<Canvas>
    <Canvas.LayoutTransform>
        <ScaleTransform x:Name="scale"  ScaleX="1" ScaleY="1" />
    </Canvas.LayoutTransform>
</Canvas>

А потом в коде кнопки Zoom Out я пишу:

if (zoomFactor > -3)
{
    scale.ScaleX /= 2;
    scale.ScaleY /= 2;
    zoomFactor--;
}

Здесь zoomFactor - это закрытая переменная, которая позволяет максимально увеличить количество нажатий на масштабирование.

Мои вопросы:

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

Также, если значение zoomFactor равно -3 или 3, можно ли отключить кнопку уменьшения или увеличения в XAML? Или, проще говоря, можно ли отключить / включить кнопку в XAML на основе значения определенной переменной?

Если да, то как?

1 Ответ

4 голосов
/ 27 декабря 2011

Здесь много вопросов: да, да и да.

Свяжите ScaleX и ScaleY для zoomFactor, затем используйте IValueConverter, который реализует предоставленную вами логику:

    <Canvas>
        <Canvas.LayoutTransform>
            <ScaleTransform x:Name="scale"  
ScaleX="{Binding zoomFactor, Converter={StaticResource ZoomConverter}" 
ScaleY="{Binding ScaleX RelativeSource={RelativeSource Mode=Self}}" />
        </Canvas.LayoutTransform>
    </Canvas>

public class ZoomConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            double zoomFactor = (Double)value;
            if (zoomFactor > -3)
            {
                return 1 / 2;
            }
            return 1;
        }

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

Что касается второго вопроса, взгляните на DataTriggers (они должны быть установлены в стиле).

...