将textBox的控制文本绑定到类属性

时间:2017-01-20 07:58:43

标签: c# wpf

我有一个图表设计师,每个图形都应该有可编辑的标志。这就是程序的样子。 enter image description here

正如您所看到的,出现了带有默认文本的文本框,但我无法弄清楚如何将文本输入保存到相应的"文本" 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));
}

1 个答案:

答案 0 :(得分:1)

要将文字从视觉TextBox保存到DesignerItem.Text属性,需要Binding。绑定目标是TextBox内的TextBoxDecoratorTemplate,绑定源是DesignerItem.Text属性。

由于您将DesignerItem实例指定为DataContext<Grid DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" .../>),因此绑定可以直接定位Text内容的DataContext属性。< / p>

<!-- 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看起来需要进行一些更改。您正在触发针对Value="True"的字符串属性,该属性仅在文本包含字符串"True"时触发。我觉得这个想法更像是触发其他东西。