2017-01-20 4 views
1

У меня есть дизайнер диаграмм, в котором каждая фигура должна иметь редактируемый знак на нем. Так выглядит программа. enter image description hereПривязать текстовый элемент textBox к свойству класса

Как вы можете видеть, текстовое поле с текстом по умолчанию появляется, но я не могу понять как сохранить ввод текста в соответствующем «Текст» свойство из DesignerItem объекта класса. DesignerItem.xaml следующим образом:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:s="clr-namespace:WPFCanvas" 
       xmlns:c="clr-namespace:WPFCanvas.Controls"> 

<ContextMenu x:Key="DesignerItemContextMenu"> 
    ... 
</ContextMenu> 

<!-- Connector Style --> 
<Style TargetType="{x:Type s:Connector}"> 
    ... 
</Style> 

<!-- ConnectorDecoratorTemplate Default Template --> 
<ControlTemplate x:Key="ConnectorDecoratorTemplate" TargetType="{x:Type Control}"> 
    ... 
</ControlTemplate> 

<!-- ResizeDecorator Default Template --> 
<ControlTemplate x:Key="ResizeDecoratorTemplate" TargetType="{x:Type Control}"> 
    ... 
</ControlTemplate> 

<!-- DragThumb Default Template --> 
<Style TargetType="{x:Type c:DragThumb}"> 
    ... 
</Style> 

<!-- TextBoxDecorator Default Template --> 
<ControlTemplate x:Key="TextBoxDecoratorTemplate" TargetType="{x:Type Control}"> 
    <ContentControl Width="Auto" Height="Auto" VerticalAlignment="Center" HorizontalAlignment="Center"> 
      <TextBox FontSize="11" Margin="1,1,0,0" TextWrapping="Wrap" AcceptsReturn="True" 
       Background="Transparent" Text="Lorem ipsum dolor sit amet, consectetuer adipiscing elit."/> 
    </ContentControl> 
</ControlTemplate> 

<!-- DesignerItem Style --> 
<Style TargetType="{x:Type s:DesignerItem}"> 
    <Setter Property="MinWidth" Value="25"/> 
    <Setter Property="MinHeight" Value="25"/> 
    <Setter Property="SnapsToDevicePixels" Value="True"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type s:DesignerItem}"> 
       <Grid DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" 
      ContextMenu="{StaticResource DesignerItemContextMenu}"> 
        <!-- DragThumb --> 
        <c:DragThumb x:Name="DragThumb" Cursor="SizeAll"/> 
        <!-- ResizeDecorator --> 
        <Control x:Name="ResizeDecorator" 
       Visibility="Collapsed" 
       Template="{StaticResource ResizeDecoratorTemplate}"/> 

        <!-- ContentPresenter --> 
        <ContentPresenter x:Name="ContentPresenter" 
          HorizontalAlignment="Stretch" 
          VerticalAlignment="Stretch" 
          Content="{TemplateBinding ContentControl.Content}" 
          Margin="{TemplateBinding ContentControl.Padding}"/> 
        <!-- ConnectorDecorator --> 
        <Control x:Name="ConnectorDecorator" 
       Visibility="Hidden" 
       Template="{StaticResource ConnectorDecoratorTemplate}"/> 

        <!-- TextBoxDecorator --> 
        <Control x:Name="TextBoxDecorator" 
       Template="{StaticResource TextBoxDecoratorTemplate}"/> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <DataTrigger Value="True" Binding="{Binding RelativeSource={RelativeSource Self},Path=Text}"> 
         <Setter TargetName="TextBoxDecorator" Property="Visibility" Value="Visible"/> 
        </DataTrigger> 
        <Trigger Property="Text" Value="true"> 
         <Setter TargetName="TextBoxDecorator" Property="Visibility" Value="Visible"/> 
        </Trigger> 
        <DataTrigger Value="True" Binding="{Binding RelativeSource={RelativeSource Self},Path=IsSelected}"> 
         <Setter TargetName="ResizeDecorator" Property="Visibility" Value="Visible"/> 
        </DataTrigger> 
        <Trigger Property="IsMouseOver" Value="true"> 
         <Setter TargetName="ConnectorDecorator" Property="Visibility" Value="Visible"/> 
        </Trigger> 
        <DataTrigger Value="True" Binding="{Binding RelativeSource={RelativeSource Self},Path=IsDragConnectionOver}"> 
         <Setter TargetName="ConnectorDecorator" Property="Visibility" Value="Visible"/> 
        </DataTrigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

И в DesignerItem.cs (без ненужного кода, а):

//These attributes identify the types of the named parts that are used for templating 
[TemplatePart(Name = "DragThumb", Type = typeof(DragThumb))] 
[TemplatePart(Name = "ResizeDecorator", Type = typeof(Control))] 
[TemplatePart(Name = "ConnectorDecorator", Type = typeof(Control))] 
[TemplatePart(Name = "ContentPresenter", Type = typeof(ContentPresenter))] 
public class DesignerItem : ContentControl, ISelectable, IGroupable 
{   
    public bool IsSelected 
    { 
     get { return (bool)GetValue(IsSelectedProperty); } 
     set { SetValue(IsSelectedProperty, value); } 
    } 
    public static readonly DependencyProperty IsSelectedProperty = 
     DependencyProperty.Register("IsSelected", typeof(bool), 
            typeof(DesignerItem), 
            new FrameworkPropertyMetadata(false));   

    public string Text 
    { 
     get { return (string)GetValue(TextProperty); } 
     set { SetValue(TextProperty, value); } 
    } 
    public static readonly DependencyProperty TextProperty = 
     DependencyProperty.Register("Text", typeof(string), 
            typeof(DesignerItem)); 
} 
+0

Я не определен, но я думаю, вам нужно установить привязку «TwoWay». – MotKohn

+1

Насколько я могу судить, 'DataContext' в' TextBoxDecoratorTemplate' должен быть вашим элементом 'DesignerItem', поэтому вы можете установить' 'вместо метки Lorem ipsum , Кроме того, ваши триггеры, где вы сравниваете «Текст» с «Истиной», не имеют большого смысла, если вы спросите меня. – grek40

+0

@ grek40 ты абсолютно прав! Теперь он работает! :) – eXPerience

ответ

1

Чтобы сохранить текст из визуальной TextBox к DesignerItem.Text требуется имущество Binding. Целью привязки является TextBox внутри TextBoxDecoratorTemplate, а источником связывания является свойство DesignerItem.Text.

Поскольку необходимо назначить экземпляр DesignerItem в качестве DataContext (<Grid DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" .../>), связывание может непосредственно целевой Text свойство DataContext содержимого.

<!-- TextBoxDecorator Default Template --> 
<ControlTemplate x:Key="TextBoxDecoratorTemplate" TargetType="{x:Type Control}"> 
    <ContentControl Width="Auto" Height="Auto" VerticalAlignment="Center" HorizontalAlignment="Center"> 
      <TextBox FontSize="11" Margin="1,1,0,0" TextWrapping="Wrap" AcceptsReturn="True" 
       Background="Transparent" Text="{Binding Text}"/> 
    </ContentControl> 
</ControlTemplate> 

Немного заметка:

Ваш ControlTemplate.Triggers выглядеть они нужны некоторые изменения. Вы вызываете свойство string по отношению к Value="True", которое вызывается только тогда, когда текст содержит строку "True". Я чувствую, что идея больше походит на запуск чего-то другого.

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