【问题标题】:Custom DependencyProperty on Style.TriggerStyle.Trigger 上的自定义 DependencyProperty
【发布时间】:2013-09-04 11:36:23
【问题描述】:

对于UserControl,我声明了DependencyProperty

        public static readonly DependencyProperty DeselectedPresentationModeProperty =
        DependencyProperty.Register(
        "DeselectedPresentationMode",
        typeof(int),
        typeof(MyUserControl),
        new FrameworkPropertyMetadata(1,FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

    public static readonly DependencyProperty SelectedPresentationModeProperty =
        DependencyProperty.Register(
        "SelectedPresentationMode",
        typeof(int),
        typeof(MyUserControl),
        new FrameworkPropertyMetadata(1, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

现在我想在 MultiTrigger 中使用这些属性:

    <Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}" x:Key="MyUserControlItemStyle">
        <Style.Triggers>
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="IsSelected" Value="False" />
                    <Condition Property="gui:MyUserControl.DeselectedPresentationMode" Value="0" />
                </MultiTrigger.Conditions>
                <MultiTrigger.Setters>
                    <Setter Property="ContentTemplate" Value="{StaticResource PresentationModeIconOnly}" />
                </MultiTrigger.Setters>
            </MultiTrigger>
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="IsSelected" Value="False" />
                    <Condition Property="gui:MyUserControl.DeselectedPresentationMode" Value="1" />
                </MultiTrigger.Conditions>
                <MultiTrigger.Setters>
                    <Setter Property="ContentTemplate" Value="{StaticResource PresentationModeSimple}" />
                </MultiTrigger.Setters>
            </MultiTrigger>
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="IsSelected" Value="True" />
                    <Condition Property="gui:MyUserControl.SelectedPresentationMode" Value="0" />
                </MultiTrigger.Conditions>
                <MultiTrigger.Setters>
                    <Setter Property="ContentTemplate" Value="{StaticResource PresentationModeExtended}" />
                </MultiTrigger.Setters>
            </MultiTrigger>
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="IsSelected" Value="True" />
                    <Condition Property="gui:MyUserControl.SelectedPresentationMode" Value="1" />
                </MultiTrigger.Conditions>
                <MultiTrigger.Setters>
                    <Setter Property="ContentTemplate" Value="{StaticResource PresentationModeIconOnly}" />
                </MultiTrigger.Setters>
            </MultiTrigger>
        </Style.Triggers>
    </Style>
    ...
    ...
    <ListBox ... ItemContainerStyle="{StaticResource MyUserControlItemStyle}"/>

但是如果我在另一个项目中使用 MyUserControl,如果我更改我的DependencyProperty 没有任何反应。我是否使用xaml 例如:

<Window 
...
x:Class="WpfControlsTester.MainWindow" 
Title="MainWindow">
<Grid>
    <GUI:MyUserControl Name="test"/>
    <Slider Minimum="0" Maximum="1" Value="{Binding SelectedPresentationMode, ElementName=test}" />
    <Slider Minimum="0" Maximum="1" Value="{Binding DeselectedPresentationMode, ElementName=test}" />
</Grid>

或者,如果我在某个事件上使用任何类型的操作,例如 this.test.DeselectedPresentationMode = 0; 之类的值。

我使用 WPF Inspector 来“调试”我的触发器,并且这两个属性始终具有它们的默认值 (1)。我的错误在哪里,或者我应该添加什么来更新我的触发器?

编辑:将错误的“MyControl”更改为“MyUserControl”

【问题讨论】:

    标签: wpf triggers dependency-properties multitrigger


    【解决方案1】:

    您可以像这样尝试使用 MultiDatatrigger 来更改属性:

    <Style.Triggers>
                    <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="False" />
                            <Condition Binding="{Binding DeselectedPresentationMode, RelativeSource={RelativeSource AncestorType={x:Type MyUserControl}}}" Value="0" />
                            </MultiDataTrigger.Conditions>
                                <MultiDataTrigger.Setters>
                            <Setter Property="ContentTemplate" Value="{StaticResource PresentationModeIconOnly}" />
                            </MultiDataTrigger.Setters>
                    </MultiDataTrigger>
                </Style.Triggers>
    

    谢谢

    【讨论】:

    • 非常感谢,它对我有用。我也尝试了 MultiDataTrigger,但我得到了一个像“属性”这样的异常——绑定不应该为空。也许我以错误的方式实现它:-)
    【解决方案2】:

    可能只是复制和粘贴错误,但在您声明Dependency Properties 的代码示例中,您的控件名为MyUserControl,但在其他代码示例中,它是叫MyControl。如果您希望它起作用,这些名称将需要匹配。

    更新>>>

    好的,我认为可能是这种情况......所以,继续......如果你只是绑定到它,你能看到属性值吗?

    <TextBlock Text="{Binding SelectedPresentationMode, ElementName=test}" />
    

    如果可以,那么我们可以继续……通常当绑定不起作用时,有一行以单词Error 开头的行输出到 Visual Studio 中的Output Window。你的错误说明了什么。如果你有? (您可能需要通过转到工具 > 选项 > 调试 > 输出窗口 > WPF 跟踪设置并将Data Binding 选项设置为WarningError 来打开此功能。)

    如果输出窗口中没有错误,则调试起来可能会比较棘手。告诉我。

    【讨论】:

    • 对不起,正如预期的那样,这只是一个 c&p 错误,所以在生产代码上这不是我的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    相关资源
    最近更新 更多