【问题标题】:WPF visibility binding not playing well with data trigger bound to visibilityWPF 可见性绑定不能很好地与绑定到可见性的数据触发器配合使用
【发布时间】:2013-02-12 23:50:42
【问题描述】:

我不知道这段代码有什么问题。也许你能发现一些我看不到的东西。我的项目构建得很好,设计师没有抱怨任何事情。但是,当我尝试运行它时,它说它无法创建此代码所在窗口的实例。

我认为我已将问题缩小到与数据触发器协调的可见性绑定。如果我删除该属性上的可见性绑定并将其任意设置为 true 或 false,它运行得很好。但我需要这个属性是动态的。

<Image Visibility="{Binding ShowStatusMessageTabIcon, Converter={StaticResource BoolToVisibility}}"
   Source="{Binding Source={x:Static bo:UserSession.Instance}, Path=HighestStatusMessageSeverity, Converter={StaticResource SeverityToImageConverter}}">
<Image.Style>
    <Style>
        <Style.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Visibility}"
                         Value="Visible">
                <DataTrigger.EnterActions>
                    <BeginStoryboard Storyboard="{StaticResource FlashErrorImage}" />
                </DataTrigger.EnterActions>
                <DataTrigger.ExitActions>
                    <RemoveStoryboard BeginStoryboardName="FlashErrorImage" />
                </DataTrigger.ExitActions>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Image.Style>

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    如果您在UIElement 本身的属性上使用Trigger,您将希望使用Trigger 而不是DataTriggerDataTriggers 更多用于更改模型中的DataObjects 等,正常@ 987654327@ 用于UIElements 等。

       <Image.Style>
            <Style TargetType="{x:Type Image}">
                <Style.Triggers>
                    <Trigger Property="Visibility" Value="Visible">
                        <Trigger.EnterActions>
                            <BeginStoryboard Storyboard="{StaticResource FlashErrorImage}" />
                        </Trigger.EnterActions>
                        <Trigger.ExitActions>
                            <RemoveStoryboard BeginStoryboardName="FlashErrorImage" />
                        </Trigger.ExitActions>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Image.Style>
    

    这是一个完整的工作模型,如果它有助于缩小问题范围

    Xaml:

    <Window x:Class="WpfApplication7.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525" Name="UI">
    
        <Window.Resources>
            <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
    
            <Storyboard x:Key="FadeAnimation" Storyboard.TargetProperty="Opacity" >
                <DoubleAnimation From="0" To="1" Duration="0:0:5" />
            </Storyboard>
        </Window.Resources>
    
        <StackPanel>
            <Image Source="http://icons.iconarchive.com/icons/iconcreme/halloween/128/Skeleton-icon.png" 
                   Visibility="{Binding ElementName=UI, Path=ImageVisible, Converter={StaticResource BooleanToVisibilityConverter}}" Height="247">
            <Image.Style>
                <Style TargetType="{x:Type Image}">
                    <Style.Triggers>
                        <Trigger Property="Visibility" Value="Visible">
                            <Trigger.EnterActions>
                                    <BeginStoryboard Name="Fade" Storyboard="{StaticResource FadeAnimation}" />
                            </Trigger.EnterActions>
                            <Trigger.ExitActions>
                                 <RemoveStoryboard BeginStoryboardName="Fade"  />
                            </Trigger.ExitActions>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </Image.Style>
        </Image>
            <Button Click="Button_Click" Content="Visible"/>
        </StackPanel>
    </Window>
    

    代码:

    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        private bool _imageVisible;
        public MainWindow()
        {
            InitializeComponent();
        }
    
        public bool ImageVisible
        {
            get { return _imageVisible; }
            set { _imageVisible = value; NotifyPropertyChanged("ImageVisible"); }
        }
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            ImageVisible = !ImageVisible;
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(string p)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(p));
            }
        }
    }
    

    【讨论】:

    • 谢谢,但是这个答案对我不起作用。它表现出与数据触发器相同的行为。如果触发了可见性以外的属性,或者我直接设置了可见性,则不会出错。还有其他想法吗? @sa_ddam213
    • 奇怪,在这里工作得很好,我什至在发布之前对其进行了测试,你确定你设置了`
    • 我想我刚刚发现了这个问题。我在窗口构造函数中为控件设置数据上下文,当我将它移动到 Loaded 事件处理程序时,它工作得很好。
    • 另外,使用数据触发器而不是常规触发器确实有效,但这可能不是最佳做法。
    • 如果有帮助,我添加了我的模型
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 2010-12-01
    • 2012-05-23
    • 2011-06-14
    • 1970-01-01
    • 2013-12-13
    相关资源
    最近更新 更多