将一个依赖属性绑定到另一个属性

时间:2012-06-22 16:54:31

标签: wpf xaml dependency-properties

我有一个我创建的自定义Tab Control,但我遇到了问题。我有一个可编辑的TextBox作为自定义TabControl视图的一部分。

<Controls:EditableTextControl x:Name="PageTypeName" 
                                  Style="{StaticResource ResourceKey={x:Type Controls:EditableTextControl}}" Grid.Row="0" TabIndex="0" 
                                  Uid="0"
                                  AutomationProperties.AutomationId="PageTypeNameTextBox"
                                  AutomationProperties.Name="PageTypeName"
                                  Visibility="{Binding ElementName=PageTabControl,Path=ShowPageType}">
        <Controls:EditableTextControl.ContextMenu>
            <ContextMenu x:Name="TabContextMenu">
                <MenuItem Header="Rename Page Type" Command="{Binding Path=PlacementTarget.EnterEditMode, RelativeSource={RelativeSource AncestorType=ContextMenu}}" 
                          AutomationProperties.AutomationId="RenamePageTypeMenuItem"
                          AutomationProperties.Name="RenamePageType"/>
                <MenuItem Header="Delete Page Type" Command="{Binding Path=PageTypeDeletedCommand}" 
                          AutomationProperties.AutomationId="DeletePageTypeMenuItem"
                          AutomationProperties.Name="DeletePageType"/>
            </ContextMenu>
        </Controls:EditableTextControl.ContextMenu>
        <Controls:EditableTextControl.Content>
            <!--<Binding Path="CurrentPageTypeViewModel.Name" Mode="TwoWay"/>-->
            <Binding ElementName="PageTabControl" Path="CurrentPageTypeName" Mode ="TwoWay"/>
        </Controls:EditableTextControl.Content>
    </Controls:EditableTextControl>

在Content部分中,我绑定了一个名为CurrentPageTypeName的依赖项Prop。此Depedency prop是此自定义Tab Control的一部分。

public static DependencyProperty CurrentPageTypeNameProperty = DependencyProperty.Register("CurrentPageTypeName", typeof(object), typeof(TabControlView));
    public object CurrentPageTypeName
    {
        get { return GetValue(CurrentPageTypeNameProperty) as object; }
        set { SetValue(CurrentPageTypeNameProperty, value); }
    }

在另一个视图中,我使用自定义TabControl,然后将我的属性与实际名称值绑定到CurrentPageTypeName属性,如下所示:

 <Views:TabControlView Grid.Row="0" Name="RunPageTabControl" 
                          TabItemsSource="{Binding RunPageTypeViewModels}"                              
                          SelectedTab="{Binding Converter={StaticResource debugConverter}}" 
                          CurrentPageTypeName="{Binding Path=RunPageName, Mode=TwoWay}" 
                          TabContentTemplateSelector="{StaticResource tabItemTemplateSelector}"  
                          SelectedIndex="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.SelectedTabIndex}"
                          ShowPageType="Hidden" >           
        <!--<Views:TabControlView.TabContentTemplate>
            <DataTemplate DataType="{x:Type ViewModels:RunPageTypeViewModel}">
                <RunViews:RunPageTypeView/>
            </DataTemplate>
        </Views:TabControlView.TabContentTemplate>-->

    </Views:TabControlView>

我的问题是似乎没有发生任何事情。它从Itemsource中获取内容,而不是从我链接的依赖项道具中获取内容。我正在尝试甚至可能吗?如果是这样,我做错了什么。

谢谢你的期待。

2 个答案:

答案 0 :(得分:1)

除非我遗漏了某些东西,否则这绝对是可能的。这是一个简化的工作示例。

具有名为TestValue的依赖项属性的用户控件,其中包含绑定到此属性的TextBox:

<UserControl x:Class="TestApp.TestControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"
             x:Name="TestControlName">
  <Grid>
    <TextBox Text="{Binding ElementName=TestControlName, Path=TestValue, Mode=TwoWay}"/>
  </Grid>
</UserControl>

使用此用户控件的不同视图,将上述依赖属性绑定到:

<Window x:Class="TestApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:TestApp="clr-namespace:TestApp" Title="MainWindow"
        Height="350" Width="525">
  <StackPanel>
    <TestApp:TestControl TestValue="{Binding ElementName=SourceTextBox, Path=Text, Mode=TwoWay}" />
    <TextBox Name="SourceTextBox" />
  </StackPanel>
</Window>

听起来问题出在您未发布的代码部分(例如内容绑定中使用的名称错误)。

答案 1 :(得分:0)

我认为您已经为“SelectedIndex”属性自行解决了这个问题。对“CurrentPageType”属性执行相同操作,即使用RelativeSource