2016-03-18 122 views
2

我正在构建一个应用程序,其中我创建了一个UserControl,其中包含第二个UserControl。XML DataTemplate绑定多层UserControl

这里是第一用户控件:

<UserControl x:Class="TasksMonitor.CustomControls.TaskCardBtn" 
      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" 
      xmlns:local="clr-namespace:TasksMonitor.CustomControls" 
      mc:Ignorable="d" 
      Name="TaskCardBtnCustomControl" 
      d:DesignHeight="300" d:DesignWidth="300"> 

    <UserControl.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="../CustomButtonsStyles.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
      <Style TargetType="ToolTip"></Style> 
     </ResourceDictionary> 
    </UserControl.Resources> 

    <Button Click="OnButtonClick" Style="{DynamicResource FlatCntrlBtn}"> 
     <Grid Width="{Binding ActualWidth, ElementName=TaskCardBtnCustomControl}" VerticalAlignment="Center" HorizontalAlignment="Stretch"> 

      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="1"/> 
       <ColumnDefinition Width="15"/> 
       <ColumnDefinition Width="10"/> 
       <ColumnDefinition Width="Auto"/> 
      </Grid.ColumnDefinitions> 

      <Grid.RowDefinitions> 
       <RowDefinition Height="35"/> 
      </Grid.RowDefinitions> 

      <Canvas Margin="4,10,0,0" Grid.Column="1"> 
       <Ellipse Width="15" Height="15" Fill="{Binding Path=StatusColor, ElementName=TaskCardBtnCustomControl, FallbackValue=#FFFFFF}"/> 
      </Canvas> 
      <TextBlock VerticalAlignment="Center" x:Name="BtnTitle" Grid.Column="3" Text="{Binding Path=BtnText, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"/> 
     </Grid> 
    </Button> 
</UserControl> 

即用户控件是这个用户控件的内部:

<UserControl x:Class="TasksMonitor.CustomControls.TaskCardUserControl" 
      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" 
      xmlns:local="clr-namespace:TasksMonitor" 
      xmlns:ut="clr-namespace:TasksMonitor.Utils" 
      xmlns:cc="clr-namespace:TasksMonitor.CustomControls" 
      Name="TaskCardUC" 
      mc:Ignorable="d" 
      Margin="5" 
      d:DesignHeight="35" d:DesignWidth="300"> 

    <UserControl.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary x:Name="Icons" Source="../Resources/Icons.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
      <ut:StatusToColorConverter x:Key="StatusToColor"/> 
     </ResourceDictionary> 
    </UserControl.Resources> 

    <Grid Width="auto"> 
     <Grid Background="#2B2B2B"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="35"/> 
       <RowDefinition Height="*"/> 
      </Grid.RowDefinitions> 

      <Grid Grid.Row="0"> 
       <cc:TaskCardBtn StatusColor="{Binding TskStatus, Converter={StaticResource StatusToColor}}" BtnText="{Binding Path=StuffYeah, ElementName=TaskCardUC}" x:Name="ExpandCollapseBtn" BtnClick="GridContentControl_Expand"/> 
      </Grid> 
      <Grid Grid.Row="1" Background="#2B2B2B" Name="GridContent" > 
       <UserControl Margin="10" Loaded="GridContentControl_Loaded"> 

       </UserControl> 
      </Grid> 

     </Grid> 

    </Grid> 
</UserControl> 

第二用户控件或父用户控件在一个DataTemplate被使用:

<Grid.Resources> 
    <DataTemplate x:Key="itemTemplate"> 
     <cc:TaskCardUserControl StuffYeah="{Binding BtnTxt}"/> 
    </DataTemplate> 
</Grid.Resources> 

当我如上面的DataTemplate中所示设置绑定到BtnTxt它不起作用,并且说它无法在对象TaskCardUserControl中找到'BtnTxt'。我觉得这是一个绑定问题,因为我从第一个UserControl绑定到父属性的属性,然后绑定到DataTemplate的父属性。我对DataTemplates和UserControl非常陌生,有人能够指出我正确的方向吗?

在此先感谢。

+0

你在哪里应用DataTemplate?列表框? –

+0

To ItemsControl –

+0

我知道,但它的来源是什么?什么是ItemsSource? –

回答

0

我想通了这个......我在代码中设置this.DataContext = this实际上是旧代码。一旦我评论这一切,一切正常。谢谢您的帮助。