Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF可见性绑定不能很好地处理绑定到可见性的数据触发器_C#_Wpf_Mvvm - Fatal编程技术网

C# WPF可见性绑定不能很好地处理绑定到可见性的数据触发器

C# WPF可见性绑定不能很好地处理绑定到可见性的数据触发器,c#,wpf,mvvm,C#,Wpf,Mvvm,我搞不懂这段代码有什么问题。也许你能发现一些我看不到的东西。我的项目建设得很好,设计师没有任何抱怨。但是,当我尝试运行它时,它说它无法创建此代码所在窗口的实例 我想我已经把问题缩小到与数据触发器协调的可见性绑定。如果我移除该属性上的可见性绑定,并任意将其设置为true或false,那么它就可以正常运行。但我需要这个属性是动态的 <Image Visibility="{Binding ShowStatusMessageTabIcon, Converter={StaticResource Bo

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

我想我已经把问题缩小到与数据触发器协调的可见性绑定。如果我移除该属性上的可见性绑定,并任意将其设置为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>


如果您对
UIElement
本身的属性使用
触发器
,您将希望使用
触发器
而不是
数据触发器
数据触发器
更多地用于模型中
数据对象
等的更改,正常
触发器
用于
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>

谢谢你,但是这个答案对我不适用。它表现出与数据触发器相同的行为。如果触发的属性不是可见性,或者如果直接设置可见性,则不会出错。还有其他想法吗@sa_DDAM213奇怪,在这里工作很好,我甚至在发布之前测试过,你确定你已经设置好了吗`我想我刚刚解决了这个问题。我在窗口构造函数中为控件设置datacontext,当我将其移动到加载的事件处理程序时,它工作得很好。此外,使用数据触发器而不是常规触发器也可以,但这可能不是最佳做法。如果有帮助,我添加了模型
<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));
        }
    }
}