繁体   English   中英

ControlTemplate中的WPF数据绑定不起作用C#

[英]WPF Databinding in ControlTemplate not working C#

我尝试将简单的布尔值绑定到控件模板中的复选框和数据触发器,但没有任何效果。 该复选框仅用于测试目的。 我已经看过这里的帖子,但是大多数问题是由于直接设置属性而不是设置样式而导致的,因此将其覆盖。 使用mouseover属性的datatrigger工作正常。 它只是绑定到布尔,这是行不通的。

到目前为止,我的代码:cs:

public partial class HostFrame : UserControl
{
    public bool test { get; set; }

    public HostFrame()
    {
        test = true;
        InitializeComponent();          
    }
}

Xaml:

<UserControl x:Class="OwnDrawingv2.Elements.HostFrame"
             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:OwnDrawingv2.Elements"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <UserControl.Resources>
        <Style TargetType="{x:Type local:HostFrame}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:HostFrame}">
                        <Grid Background="LightBlue" Name="host_grid">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"></ColumnDefinition>
                                <ColumnDefinition Width="Auto"></ColumnDefinition>
                                <ColumnDefinition Width="Auto"></ColumnDefinition>
                            </Grid.ColumnDefinitions>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="20"></RowDefinition>
                                    <RowDefinition Height="Auto"></RowDefinition>
                                </Grid.RowDefinitions>
                            <ContentPresenter Name="content" Grid.Row="1" Grid.Column="1" />
                            <CheckBox Grid.Column="0" Grid.Row="0" IsChecked="{Binding Path=test}"> <!--Test prupose-->
                            </CheckBox>
                            <Image Grid.Column="1" Grid.Row="0" Name="attention" Width="30" Height="30"  Source="/attention_icon.png">
                                <Image.Style>
                                    <Style TargetType="Image">
                                        <Setter Property="Visibility" Value="Visible"></Setter>
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding Path=test}" Value="true">

                                                <Setter Property="Visibility" Value="Hidden"></Setter>
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </Image.Style>
                            </Image>
                            <Ellipse Grid.Column="0" Grid.Row="1" Width="10" Height="10"  Fill="Black">
                                <Ellipse.Style>
                                    <Style TargetType="Ellipse">
                                        <Setter Property="Visibility" Value="Hidden"></Setter>
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding ElementName=content, Path=IsMouseOver}" Value="true">
                                                <Setter Property="Visibility" Value="Visible"></Setter>
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </Ellipse.Style>
                            </Ellipse>
                            <Ellipse Grid.Column="2" Grid.Row="1" Width="10" Height="10"  Fill="Black">
                                <Ellipse.Style>
                                    <Style TargetType="Ellipse">
                                        <Setter Property="Visibility" Value="Hidden"></Setter>
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding ElementName=content, Path=IsMouseOver}" Value="true">
                                                <Setter Property="Visibility" Value="Visible"></Setter>
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </Ellipse.Style>
                            </Ellipse>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </UserControl.Resources>
</UserControl>

更新:我得到了原始问题的答案,并且我理解这一点。 但是,为什么在网络上有没有相对资源的教程似乎可以正常工作? UPDATE2:我错过了一个有关Datacontext的答案信息,谢谢。 问题已经解决了。

您尚未为您的UserControl设置Datacontext ,因此我认为它将为null。 您应该在输出中看到绑定错误。

另一方面,您的属性test不会通知更改。 如果它属于UserControl(而不是ViewModel的一部分),则应将其声明为依赖项属性。

如果执行以下IsChecked="{Binding Path=test}" ,则意味着您的UserControl类是其自身的DataContext(或者您没有这么说)。 所以你有两种解决方案(我猜)

1-将您的Test属性移至ViewModel并进行绑定。 2-使用RelativeResource和FindAncestor方法( {Binding Path=PathToProperty, RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}} ))

PS:如果您的HostFrame继承自Control,UIELement ...,则最好定义DependencyProperty并执行TemplateBinding

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM