XML DataTemplate绑定MultiLayer UserControl

时间:2016-03-18 18:53:23

标签: c# wpf binding user-controls datatemplate

我正在构建一个应用程序,我在其中创建了一个UserControl,其中包含第二个UserControl。

这是第一个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在此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>

第二个UserControl或Parent UserControl正在DataTemplate中使用:

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

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

提前致谢。

1 个答案:

答案 0 :(得分:0)

我想出来了......我在代码中设置this.DataContext = this,这实际上是旧代码。一旦我评论了这一切,一切都按预期工作。谢谢你的帮助。