C# 激发的datatrigger未更改自定义控件';新增加的财产

C# 激发的datatrigger未更改自定义控件';新增加的财产,c#,wpf,xaml,C#,Wpf,Xaml,我正在创建一个动画控件,并尝试使用数据触发器。问题是我创建的dp属性在触发时没有被更改/调用。以下是我注意到的行为总结 1) 的背后的代码永远不会被调用 2) 属性出现在XAML intellisense中,但XAML中给出的更改永远不会应用(设计/运行时)。但是,如果我将“public static readonly dependencProperty IsSpiningProperty=dependencProperty.Register”(“IsSpining”、typeof(bool)、

我正在创建一个动画控件,并尝试使用数据触发器。问题是我创建的dp属性在触发时没有被更改/调用。以下是我注意到的行为总结

1) 的背后的代码永远不会被调用

2) 属性出现在XAML intellisense中,但XAML中给出的更改永远不会应用(设计/运行时)。但是,如果我将“public static readonly dependencProperty IsSpiningProperty=dependencProperty.Register”(“IsSpining”、typeof(bool)、typeof(ProgressWaitSpinner)、new UIPropertyMetadata(false));”中的“IsSpining”替换为其他内容(比如“xyz”),它将开始进行属性分配,但如果启用了样式,则会引发运行时异常

3) 运行示例时,矩形应该隐藏,而不是显示为巧克力色,这是不可能的

4) 用于更改颜色的Setter正在工作,这来自用户控件,但是新创建的属性上的Setter属性不工作

我在这里创建了一个简化的示例来说明问题。有人知道发生了什么事吗

UserControl XAML:

<UserControl x:Class="CustomControls.ProgressWaitSpinner"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:CustomControls" 
    Height="191" Width="191">
    <Grid x:Name="LayoutRoot">
        <Label Height="32" Name="label1" VerticalAlignment="Top" />
    </Grid>
</UserControl>
主窗口XAML:

<Window x:Class="WPFSpinnerWait.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:usrctrl="clr-namespace:CustomControls"
        Title="MainWindow" Height="208" Width="228">
    <Grid>
        <usrctrl:ProgressWaitSpinner Height="40" x:Name="WaitSpinner" Margin="110,103,0,0" HorizontalAlignment="Left" Width="84" VerticalAlignment="Top">
            <usrctrl:ProgressWaitSpinner.Style>
                <Style>
                    <Style.Triggers>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition Binding="{Binding ElementName=label1, Path=Content}" Value="NotStarted"></Condition>
                            </MultiDataTrigger.Conditions>
                            <Setter Property="usrctrl:ProgressWaitSpinner.Background" Value="Red" />
                            <Setter Property="usrctrl:ProgressWaitSpinner.IsSpinning" Value="false"/>
                        </MultiDataTrigger>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition Binding="{Binding ElementName=label1, Path=Content}" Value="Running"></Condition>
                            </MultiDataTrigger.Conditions>
                            <Setter Property="usrctrl:ProgressWaitSpinner.Background" Value="Chocolate" />
                            <Setter Property="usrctrl:ProgressWaitSpinner.IsSpinning" Value="true" />
                        </MultiDataTrigger>
                    </Style.Triggers>
                </Style>
            </usrctrl:ProgressWaitSpinner.Style>
        </usrctrl:ProgressWaitSpinner>
        <Button Content="NotStarted" Height="28" HorizontalAlignment="Left" Margin="38,22,0,0" Name="checkBox1" VerticalAlignment="Top" Width="136" Click="checkBox1_Checked" />
        <Button Content="Running" Height="30" HorizontalAlignment="Left" Margin="38,56,0,0" Name="checkBox2" VerticalAlignment="Top" Width="136" Click="checkBox1_Checked" />
        <Label Content="NotStarted" DataContext="usrctrl:ProgressWaitSpinner" Height="25" HorizontalAlignment="Left" Margin="38,92,0,0" Name="label1" VerticalAlignment="Top" Width="114" />
    </Grid>
</Window>

主窗口代码:

using System.Windows;
using System.Windows.Controls;

namespace WPFSpinnerWait
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void checkBox1_Checked(object sender, RoutedEventArgs e)
        {
            label1.Content = ((Button)sender).Content.ToString();
        }

    }
}
使用System.Windows;
使用System.Windows.Controls;
命名空间WPFSpinnerWait
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
私有无效复选框1\u已选中(对象发送方,路由目标e)
{
label1.Content=((按钮)sender.Content.ToString();
}
}
}

不会调用后面的代码,
依赖属性
在Xaml中更改/使用该属性时,不要使用backing属性,它们仅在代码后面用作助手,在Xaml绑定中没有任何用处

您可以使用
DependencyProperty
PropertyChanged
事件来代替

    public bool IsSpinning
    {
        get { return (bool)GetValue(IsSpinningProperty); }
        set { SetValue(IsSpinningProperty, value); }
    }

    // Using a DependencyProperty as the backing store for IsSpinning.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty IsSpinningProperty =
        DependencyProperty.Register("IsSpinning", typeof(bool), typeof(ProgressWaitSpinner), new PropertyMetadata(false, OnIsSpinningChanged));

    private static void OnIsSpinningChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (((bool)e.NewValue) == true)
        {
            (d as ProgressWaitSpinner).Visibility = System.Windows.Visibility.Visible;
        }
        else
        {
            (d as ProgressWaitSpinner).Visibility = System.Windows.Visibility.Hidden;
        }
    }

编辑: 对于第二个问题,请尝试为您的
样式添加
TargetType
,以便您可以直接访问属性

 <Style TargetType="{x:Type usrctrl:ProgressWaitSpinner}">
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding ElementName=label1, Path=Content}" Value="NotStarted"></Condition>
            </MultiDataTrigger.Conditions>
            <Setter Property="Background" Value="Red" />
            <Setter Property="IsSpinning" Value="false"/>
        </MultiDataTrigger>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding ElementName=label1, Path=Content}" Value="Running"></Condition>
            </MultiDataTrigger.Conditions>
            <Setter Property="Background" Value="Chocolate" />
            <Setter Property="IsSpinning" Value="true" />
        </MultiDataTrigger>
    </Style.Triggers>
</Style>


codebehind不会被调用,DependencyProperty不使用backing属性,它们只在codebehind中使用,它们在Xaml bindingsAwesome中没有用处。。。感谢您的快速回复…它解决了我的核心问题。。。谢谢sa_ddam213:)。。。还是有个小问题。我正在尝试将此控件属性用作xaml中的常规属性,如何使其成为可能?行为2:在我的问题中,添加了更新,当我将正确的TargetType添加到您的样式中并设置属性hanks以进行回复时,它似乎起到了作用。这里有点混乱。。。我所做的:(1)添加了代码(2)修改了xaml:
 <Style TargetType="{x:Type usrctrl:ProgressWaitSpinner}">
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding ElementName=label1, Path=Content}" Value="NotStarted"></Condition>
            </MultiDataTrigger.Conditions>
            <Setter Property="Background" Value="Red" />
            <Setter Property="IsSpinning" Value="false"/>
        </MultiDataTrigger>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding ElementName=label1, Path=Content}" Value="Running"></Condition>
            </MultiDataTrigger.Conditions>
            <Setter Property="Background" Value="Chocolate" />
            <Setter Property="IsSpinning" Value="true" />
        </MultiDataTrigger>
    </Style.Triggers>
</Style>