2011-01-10 4 views
0

У меня есть модель представления, которые состоят из отдельных узлов и некоторых разъемов:Sunchronizing вид модели и вид

public class ViewModel 
{ 
    public List<Node> Nodes{get;set;} 
    public List<Connector> Connectors{get;set;} 
} 

public Class Node 
{ 
    public Point Position{get;set;} 
} 

public class Connector 
{ 
    public Node StartNode{get;set;} 
    public Node EndNode{get;set;}  
} 

Теперь я отображающих узлы страницы с помощью элементов управления:

<UserControl.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="Styles.xaml"></ResourceDictionary> 
      </ResourceDictionary.MergedDictionaries> 
      <local:ElementThumbConverter x:Key="ElementThumbConverter"/> 
      <local:ElementThumbConverter2 x:Key="ElementThumbConverter2"/> 
      <Style x:Key="ElementThumbVMDataTemplateStyle" TargetType="ContentPresenter"> 
       <Setter Property="Canvas.Left" Value="{Binding CanvasLeft,Mode=TwoWay}" /> 
       <Setter Property="Canvas.Top" Value="{Binding CanvasTop,Mode=TwoWay}" /> 
       <!--<Setter Property="Canvas.Top" Value="{Binding RelativeSource={RelativeSource Self},Path=ContentTemplate.elementThumb.(Canvas.Top), Mode=TwoWay}" />--> 
      </Style > 
      <DataTemplate DataType="{x:Type vm:ElementThumbVM}"> 
       <!--Canvas.Left="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ContentPresenter},Path=(Canvas.Left),Mode=TwoWay}"--> 
       <kw:ElementThumb Name="elementThumb" Tag="" 
           Canvas.Left="{Binding CanvasLeft,Mode=TwoWay}" 
           Canvas.Top="{Binding CanvasTop,Mode=TwoWay}"> 
       </kw:ElementThumb> 
       <DataTemplate.Triggers> 
        <DataTrigger Binding="{Binding ElementType}"> 
         <DataTrigger.Value> 
          <vm:ElementType>BusinessServer</vm:ElementType> 
         </DataTrigger.Value> 
         <Setter TargetName="elementThumb" Property="Style" Value="{StaticResource BussinesServerStyle}"/> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding ElementType}"> 
         <DataTrigger.Value> 
          <vm:ElementType>DataBase</vm:ElementType> 
         </DataTrigger.Value> 
         <Setter TargetName="elementThumb" Property="Style" Value="{StaticResource DataBaseStyle}"/> 
        </DataTrigger> 
       </DataTemplate.Triggers> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type vm:ConnectorVM}"> 
       <kw:Connector> 
        <kw:Connector.StartElementThumb> 
         <Binding Converter="{StaticResource ElementThumbConverter2}"> 
          <Binding.Source> 
           <MultiBinding Converter="{StaticResource ElementThumbConverter}"> 
            <Binding Path="ElementThumbVMStartId" /> 
            <Binding RelativeSource="{RelativeSource Mode=FindAncestor,AncestorType=kw:DiagramCanvas}"/> 
           </MultiBinding> 
          </Binding.Source> 
         </Binding> 
        </kw:Connector.StartElementThumb> 
        <kw:Connector.EndElementThumb> 
         <Binding Converter="{StaticResource ElementThumbConverter2}"> 
          <Binding.Source> 
           <MultiBinding Converter="{StaticResource ElementThumbConverter}"> 
            <Binding Path="ElementThumbVMEndId" /> 
            <Binding RelativeSource="{RelativeSource Mode=FindAncestor,AncestorType=kw:DiagramCanvas}"/> 
           </MultiBinding> 
          </Binding.Source> 
         </Binding> 
        </kw:Connector.EndElementThumb> 
       </kw:Connector> 
      </DataTemplate> 
     </ResourceDictionary> 
    </UserControl.Resources> 

    <ItemsControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
        ItemsSource="{Binding AllElements}" x:Name="mainCanvasControl" 
        ItemContainerStyle="{StaticResource ElementThumbVMDataTemplateStyle}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <kw:DiagramCanvas Name="mainCanvas" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
    </ItemsControl> 

Как вы видите, У меня есть шаблон для узлов и коннекторов, он отлично работает для узлов, , но для коннектора мне нужен его соответствующий начальный и конечный узел, поэтому, когда узел в пользовательском интерфейсе меняет свое положение, я могу отслеживать его изменение и отображать его в коннекторе, я также необходимо окончательно отобразить с t узла отображения (я говорю ElmenetThumb). Короче говоря, каждый узел модели имеет аналогичную страницу ElmenetThumb, на которой я хочу передать аналогичный ElmenetThumb стартового и конечного узлов на аналогичный элемент разъема для отслеживания местоположения. Я пытаюсь сделать это с помощью коннектора, как вы можете видеть в приведенном выше коде, но он не работает, потому что во время вызова конвертировать содержимое ItemsControl невозможно полностью.

ответ

0

Я делаю это совершенно другим способом, что я не могу сказать, что это ViewModel. A Определите метод отображения для моего холста:

public class ConfigCanvas : Canvas 
    { 
     Dictionary<Node, ElementThumb> nodes = new Dictionary<Node, ElementThumb>(); 

     public void Dispaly(SettingsPackModel model) 
     { 
      foreach (Node node in model.Nodes) 
      { 
       ElementThumb element = new ElementThumb(); 

       Binding topBinding = new Binding("LayoutInfo.CanvasTop"); 
       topBinding.Source = node; 
       element.SetBinding(Canvas.TopProperty, topBinding); 

       Binding leftBinding = new Binding("LayoutInfo.CanvasLeft"); 
       leftBinding.Source = node; 
       element.SetBinding(Canvas.LeftProperty, leftBinding); 

       element.Style = (Style)FindResource(node.NodeType + "Style"); 

       this.Children.Add(element); 
       nodes.Add(node, element); 
      } 

      foreach (Connection connection in model.Connections) 
      { 
       Connector connector = new Connector() 
       { 
        StartElementThumb = nodes[connection.StartNode], 
        EndElementThumb = nodes[connection.EndNode] 
       }; 

       connector.Style = (Style)FindResource(typeof(Connector)); 

       this.Children.Add(connector); 
      } 
     } 
    } 

Но я думаю, что это не лучший подход. Как вы думаете?

Смежные вопросы