Я создаю игровой стол. Я хотел указать размер поля (одно поле является квадратом) как приложенное свойство и с этим значением набора данных 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();
}
}
}
TemplateBindings
работают только для свойств зависимостей, определенных в шаблоне элемента управления (в ControlTemplate
). Вам просто нужно переключить это на Binding
с RelativeSource
of AncestorType
(также, прикрепленные свойства требуют использования скобок в привязке):
...
<DrawingBrush Viewport="{Binding Path=(local:GameDeskProperties.FieldSize), Converter={StaticResource fieldSizeConverter}, RelativeSource={RelativeSource AncestorType={x:Type Rectangle}}}"
...
Изменить Обновлена привязка RelativeSource
, поскольку она не была определена внутри ControlTemplate
.