TemplateBinding с Преобразователем - что не так?

Я создаю игровой стол. Я хотел указать размер поля (одно поле является квадратом) как приложенное свойство и с этим значением набора данных ViewPort, который потянул бы 2x2 матрица (и режим мозаики сделает остальную часть игрового стола).

Я вполне в потере что не так, потому что привязка не работает.

При тестировании строки в XAML для поведения я хотел бы иметь:


Игровой стол основан на этой выборке DrawingPaint: http://msdn.microsoft.com/en-us/library/aa970904.aspx (изображение здесь),

XAML:


    
        
        
    

    
                
    

Преобразователь и определение свойства:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Controls;
using System.Windows;
using System.Diagnostics;
using System.Windows.Data;

namespace Sokoban
{
    public class GameDeskProperties : Panel
    {

        public static readonly DependencyProperty FieldSizeProperty;

        static GameDeskProperties()
        {
            PropertyChangedCallback fieldSizeChanged =
                new PropertyChangedCallback(OnFieldSizeChanged);
            PropertyMetadata fieldSizeMetadata =
                new PropertyMetadata(50, fieldSizeChanged);

            FieldSizeProperty = DependencyProperty.RegisterAttached("FieldSize",
                typeof(int), typeof(GameDeskProperties), fieldSizeMetadata);
        }

        public static int GetFieldSize(DependencyObject target)
        {
            return (int)target.GetValue(FieldSizeProperty);
        }

        public static void SetFieldSize(DependencyObject target, int value)
        {
            target.SetValue(FieldSizeProperty, value);
        }


        static void OnFieldSizeChanged(DependencyObject target,
                              DependencyPropertyChangedEventArgs e)
        {
            Debug.WriteLine("FieldSize just changed: " + e.NewValue);
        }
    }

    [ValueConversion(/* sourceType */ typeof(int), /* targetType */ typeof(Rect))]
    public class FieldSizeToRectConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            Debug.Assert(targetType == typeof(int));

            int fieldSize = int.Parse(value.ToString());
            return new Rect(0, 0, 2 * fieldSize, 2 * fieldSize);
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            // should not be called in our example
            throw new NotImplementedException();
        }
    }
}

7
задан Martin Vseticka 6 April 2010 в 15:39
поделиться

1 ответ

TemplateBindings работают только для свойств зависимостей, определенных в шаблоне элемента управления (в ControlTemplate ). Вам просто нужно переключить это на Binding с RelativeSource of AncestorType (также, прикрепленные свойства требуют использования скобок в привязке):

...
<DrawingBrush Viewport="{Binding Path=(local:GameDeskProperties.FieldSize), Converter={StaticResource fieldSizeConverter}, RelativeSource={RelativeSource AncestorType={x:Type Rectangle}}}"
...

Изменить Обновлена ​​привязка RelativeSource , поскольку она не была определена внутри ControlTemplate .

11
ответ дан 6 December 2019 в 23:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: