2010-04-06 21 views
7

Oyun masası oluşturuyorum. Ekli bir özellik olarak alan boyutunu (bir alan bir karedir) ve 2x2 matrisini çizen ViewPort'un bu veri kümesi değeri ile belirtmek istedim (ve karo modu oyun masasının geri kalanını yapardı).TemplateBinding with Converter - Sorun nedir?

Neyin yanlış olduğu oldukça yanlıştır çünkü ciltleme çalışmıyor.

Ben istiyorum davranışı için XAML

Test hattı:

<DrawingBrush Viewport="0,0,100,100" ViewportUnits="Absolute" TileMode="None"> 

oyun masası DrawingPaint bu örnek dayanmaktadır: http://msdn.microsoft.com/en-us/library/aa970904.aspx (görüntü buradadır)

XAML:

<Window x:Class="Sokoban.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:Sokoban" 
    Title="Window1" Height="559" Width="419"> 
    <Window.Resources> 
     <local:FieldSizeToRectConverter x:Key="fieldSizeConverter" /> 
     <Style x:Key="GameDesk" TargetType="{x:Type Rectangle}"> 
      <Setter Property="local:GameDeskProperties.FieldSize" Value="50" /> 
      <Setter Property="Fill"> 
       <Setter.Value> 
        <!--<DrawingBrush Viewport="0,0,100,100" ViewportUnits="Absolute" TileMode="None">--> 
        <DrawingBrush Viewport="{TemplateBinding local:GameDeskProperties.FieldSize, Converter={StaticResource fieldSizeConverter}}" ViewportUnits="Absolute" TileMode="None"> 
         <DrawingBrush.Drawing> 
          <DrawingGroup> 
           <GeometryDrawing Brush="CornflowerBlue"> 
            <GeometryDrawing.Geometry> 
             <RectangleGeometry Rect="0,0,100,100" /> 
            </GeometryDrawing.Geometry> 
           </GeometryDrawing> 

           <GeometryDrawing Brush="Azure"> 
            <GeometryDrawing.Geometry> 
             <GeometryGroup> 
              <RectangleGeometry Rect="0,0,50,50" /> 
              <RectangleGeometry Rect="50,50,50,50" /> 
             </GeometryGroup> 
            </GeometryDrawing.Geometry> 
           </GeometryDrawing> 
          </DrawingGroup> 
         </DrawingBrush.Drawing> 
        </DrawingBrush> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Window.Resources> 

    <StackPanel> 
     <Rectangle Style="{StaticResource GameDesk}" Width="300" Height="150" />   
    </StackPanel> 
</Window> 

Dönüştürücü ve mülkiyet tanımı:

cevap

11

TemplateBindings yalnızca, denetlenen denetimle tanımlanan bağımlılık özellikleri için çalışır (ControlTemplate). Sadece (aynı zamanda ekli özellikler bağlayıcı kullanılmak üzere parantez gerektiren) bir RelativeSourceAncestorType ait olan bir Binding olmaya Bunu tersine geçmeniz gerekir: bu değildi olarak

Düzenleme, RelativeSource bağlama Güncelleme

... 
<DrawingBrush Viewport="{Binding Path=(local:GameDeskProperties.FieldSize), Converter={StaticResource fieldSizeConverter}, RelativeSource={RelativeSource AncestorType={x:Type Rectangle}}}" 
... 
ControlTemplate'un içinde tanımlanmış.

+0

Visual Studio'nun çıktı penceresinde bu hatayı buldum: System.Windows.Data Hatası: 2: Hedef öğe için FrameworkElement veya FrameworkContentElement öğesi bulunamıyor. BindingExpression: Yol (= 0); Dataıtem = null; hedef eleman 'DrawingBrush' (HashCode = 35191196); Hedef özellik 'Viewport' ('Rect') 'dir –

+0

Üzgünüm, ayarlamış olduğunuz mülkte yakından bakmadım. Cevabı güncelledim, böylece gerçekten çalışıyor. –

+0

Teşekkürler, önceki örneğinizden öğrendim. –