【问题标题】:XML DataTemplate Binding MultiLayer UserControlXML DataTemplate 绑定多层用户控件
【发布时间】:2016-07-05 16:09:14
【问题描述】:

我正在构建一个应用程序,其中我创建了一个 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>

第二个用户控件或父用户控件正在 DataTemplate 中使用:

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

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

提前致谢。

【问题讨论】:

  • 您在哪里应用 DataTemplate?列表框?
  • 我知道,但它的来源是什么?什么是 ItemsSource?
  • 源是我用 2 个字符串属性和一个布尔属性创建的公共类的 observablecollection。我用一个按钮而不是我的自定义控件对其进行了测试,它工作正常我还使用一个只有一层的自定义控件对其进行了测试,它可以工作,但是第二次我将一个自定义控件放在另一个里面它就坏了。这就是为什么我认为我绑定的东西不正确

标签: c# wpf binding user-controls datatemplate


【解决方案1】:

我想通了...我在实际上是旧代码的代码中设置了this.DataContext = this。一旦我对此发表评论,一切都会正常进行。感谢您的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-21
    • 2011-11-22
    • 2021-08-10
    • 2013-01-01
    • 2017-05-16
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    相关资源
    最近更新 更多