2012-05-13 3 views
1

저는 작은 대학 프로젝트에서 일부 테이블과 함수를 사용하여 Lua 파일을 읽고 모양을 만들 필요가 있습니다. 끝났어.양방향 데이터 바인딩이 WPF에서 작동하지 않는 이유는 무엇입니까?

문제는 대화 형으로 만들려고 할 때입니다. 내 XAML은 다음과 같습니다.

<Window x:Class="Gemi.WPF.VentanaPrincipal" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:Gemi.WPF" 
     Title="GEMI - Geometría Interactiva!" Height="350" Width="525"> 
    <Window.Resources> 
     <local:DoblesAPunto x:Key="DoblesAPunto"/> 
    </Window.Resources> 
    <DockPanel LastChildFill="True" Background="White"> 
     <Grid DockPanel.Dock="Top"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 
      <Label Content="Figura Seleccionada: "/> 
      <ComboBox Name="cbFiguras" HorizontalAlignment="Stretch" Grid.Column="1" 
         ItemsSource="{Binding Path=Figuras}" DisplayMemberPath="Nombre" SelectionChanged="cbFiguras_FiguraSeleccionada" /> 
     </Grid> 
     <ScrollViewer DockPanel.Dock="Bottom" Name="scrollPropiedades" 
         Height="Auto" VerticalScrollBarVisibility="Auto"> 
      <DockPanel Name="dpPropiedades"> 
       <StackPanel Orientation="Vertical" Name="spNombres" DockPanel.Dock="Left"/> 
       <StackPanel Orientation="Vertical" Name="spValores" DockPanel.Dock="Right" Margin="10, 0, 0, 0"/> 
      </DockPanel> 
     </ScrollViewer> 
     <DockPanel LastChildFill="True"> 
      <Slider Name="controlZoom" DockPanel.Dock="Bottom" Value="1" 
        Maximum="50" Minimum="0.1" Orientation="Horizontal" ToolTip="Controla el zoom de la figura"/> 
      <ItemsControl x:Name="cnvFigura" ItemsSource="{Binding Puntos}"> 
       <ItemsControl.LayoutTransform> 
        <ScaleTransform 
        CenterX="0" CenterY="0" 
        ScaleX="{Binding ElementName=controlZoom,Path=Value}" 
        ScaleY="{Binding ElementName=controlZoom,Path=Value}"/> 
       </ItemsControl.LayoutTransform> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <Path Fill="Black" local:DragCanvas.CanBeDragged="True" 
           local:DragCanvas.Top="{Binding Y, Mode=TwoWay}" 
           local:DragCanvas.Left="{Binding X, Mode=TwoWay}"> 
          <Path.Data> 
           <EllipseGeometry RadiusX="5" RadiusY="5"> 
            <EllipseGeometry.Center> 
             <MultiBinding Converter="{StaticResource DoblesAPunto}"> 
              <Binding Path="X" /> 
              <Binding Path="Y" /> 
             </MultiBinding> 
            </EllipseGeometry.Center> 
           </EllipseGeometry> 
          </Path.Data> 
          <Path.ToolTip> 
           <Grid> 
            <Grid.RowDefinitions> 
             <RowDefinition Height="Auto"/> 
             <RowDefinition Height="Auto"/> 
            </Grid.RowDefinitions> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="Auto"/> 
             <ColumnDefinition Width="Auto"/> 
            </Grid.ColumnDefinitions> 
            <TextBlock Text="X = " Grid.Column="0" Grid.Row="0"/> 
            <TextBlock Text="{Binding X}" Grid.Column="1" Grid.Row="0"/> 
            <TextBlock Text="Y = " Grid.Column="0" Grid.Row="1"/> 
            <TextBlock Text="{Binding Y}" Grid.Column="1" Grid.Row="1"/> 
           </Grid> 
          </Path.ToolTip> 
         </Path> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <local:DragCanvas IsItemsHost="True"/> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
      </ItemsControl> 
     </DockPanel> 
    </DockPanel> 
</Window> 

문제는 바인딩이 업데이트되지 않는다는 것입니다. "Punto"객체의 setter는 DataTemplate을 구성하는 타원을 드래그하더라도 호출되지 않습니다. 어떤 아이디어?

또한 왜 타원의 중심을 바인딩해야합니까? DragCanvas의 위쪽/아래쪽/왼쪽/오른쪽 만 바인딩하면 모든 점이 0,0에 그려집니다. 그러면 점을 처음부터 왼쪽 또는 위쪽으로 끌 수 없으므로 문제가 발생합니다.

+1

아마도 누락 된 모드 = TwoWay? – daryal

답변

0

이것은 끌어서 놓기가 Canvas.Left 및 Canvas.Top을 수정하지 않고 대신 변환 (변환)을 사용하기 때문에 발생할 수 있습니다.

드래그 앤 드롭 시스템이이 변환을 변환 그룹에 추가하기 때문에이 변환에 바인딩하는 것이 까다로울 수 있습니다. 따라서 변환에 추가 한 번역은 업데이트되지 않습니다.

+0

http://www.codeproject.com/Articles/15354/Dragging-Elements-in-a-Canvas 당신은 그것을보고 싶을 것입니다. WPF에서 XNA로 옮겼습니다 ... WPF는 게임에 필요한 '주스'가없는 것 같습니다. – Machinarius

+0

게임 종류에 따라 다릅니다. –

+0

기본적으로, 나는 화면에서 모양이 렌더링되는 "게임"을하고 싶습니다. 모양의 가장자리를 드래그하면 모양의 속성이 실시간으로 업데이트됩니다. WPF는이 기능을 사용할 수 있습니까? – Machinarius

관련 문제