Laden...

Datatrigger: Reagiert auf Änderung des Properties im ViewModel nicht [gelöst]

Erstellt von deinChef vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.453 Views
D
deinChef Themenstarter:in
2 Beiträge seit 2009
vor 8 Jahren
Datatrigger: Reagiert auf Änderung des Properties im ViewModel nicht [gelöst]

Hallo liebe C# Community,

Ich hab jetzt schon gefühlt eine ewigkeit gesucht hab aber zu diesen Thema direkt nichts gefunden.

Ich möchte ein Menü auf der Linken Seite auf und zu klappen. Da ich dies animieren möchte und das ganze über das zugehörige ViewModel gesteuert wird, hab ich ein Datatrigger in den Border gesetzt. Der soll bei Veränderung des Properties die jeweilige Animation starten.

Beim Start der WPF Anwendung funktioniert das wunderbar. Beim zweiten mal wird dieser nicht getriggert ?
Property wird geändert und

View:


<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" xmlns:local="clr-namespace:WPFTestApp" x:Class="WPFTestApp.MainWindow"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <local:MainViewModel/>
    </Window.DataContext>
    <DockPanel>
        <Border x:Name="LeftMenuBorder" Background="WhiteSmoke" DockPanel.Dock="Left" CornerRadius="0,5,5,0">
            <Border.Style>
                <Style TargetType="{x:Type Border}">
                    <Setter Property="Width" Value="230"/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding LeftMenuVisible, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Value="True">
                            <DataTrigger.EnterActions>
                                <BeginStoryboard>
                                    <Storyboard>
                                        <DoubleAnimation Duration="0:0:1" Storyboard.TargetProperty="Width" To="230" />
                                    </Storyboard>
                                </BeginStoryboard>
                            </DataTrigger.EnterActions>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding LeftMenuVisible, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Value="False">
                            <DataTrigger.EnterActions>
                                <BeginStoryboard>
                                    <Storyboard>
                                        <DoubleAnimation Duration="0:0:1" Storyboard.TargetProperty="Width" To="0" />
                                    </Storyboard>
                                </BeginStoryboard>
                            </DataTrigger.EnterActions>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Border.Style>
            <TextBlock TextWrapping="Wrap" Text="{Binding LeftMenuVisible}"/>
        </Border>
        <Border Width="10" Background="Gray">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseLeftButtonDown">
                    <ei:CallMethodAction/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Border>
        <Grid/>
    </DockPanel>
</Window>

ViewModel:


namespace WPFTestApp
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using ShadowMVVM;

    class MainViewModel : BaseViewModel
    {
        private bool _LeftMenuVisible = false;
        public bool LeftMenuVisible
        {
            get
            {
                return this._LeftMenuVisible;
            }

            set
            {
                this._LeftMenuVisible = value;
                this.NotifyPropertyChanged("LeftMenuVisible");
            }
        }

        public void ChangeVisible ()
        {
            this.LeftMenuVisible = !this.LeftMenuVisible;
        }

    }
}

Kann ein Datatrigger mehr als einmal angesprochen werden ?

Ich hoffe einer kann mir helfen

Gruß
Jeffrey

Probleme sind zum Lösen da!

1.378 Beiträge seit 2006
vor 8 Jahren

Hallo deinChef,

ich kenn mich zwar mit Animations in WPF nicht all zu sehr aus, konnte aber dein Beispiel soweit anpassen, dass es glaub ich das tut, was du willst:

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" xmlns:local="clr-namespace:WPFTestApp" x:Class="WpfApplication1.MainWindow"
        Title="MainWindow" Height="350" Width="525">
   <Window.DataContext>
      <local:MainViewModel/>
   </Window.DataContext>
   <DockPanel>
      <Border x:Name="LeftMenuBorder" Background="WhiteSmoke" DockPanel.Dock="Left" CornerRadius="0,5,5,0">
         <Border.Style>
            <Style TargetType="{x:Type Border}">
               <Setter Property="Width" Value="230"/>
               <Style.Triggers>
                  <DataTrigger Binding="{Binding LeftMenuVisible}" Value="True">
                     <DataTrigger.EnterActions>
                        <BeginStoryboard Name="growStoryBoard">
                           <Storyboard>
                              <DoubleAnimation Duration="0:0:1" Storyboard.TargetProperty="Width" From="0" To="230" />
                           </Storyboard>
                        </BeginStoryboard>
                     </DataTrigger.EnterActions>
                     <DataTrigger.ExitActions>
                        <RemoveStoryboard BeginStoryboardName="growStoryBoard"></RemoveStoryboard>
                     </DataTrigger.ExitActions>
                  </DataTrigger>
                  <DataTrigger Binding="{Binding LeftMenuVisible}" Value="False">
                     <DataTrigger.EnterActions>
                        <BeginStoryboard Name="shrinkStoryBoard">
                           <Storyboard>
                              <DoubleAnimation Duration="0:0:1" Storyboard.TargetProperty="Width" To="0" />
                           </Storyboard>
                        </BeginStoryboard>
                     </DataTrigger.EnterActions>
                     <DataTrigger.ExitActions>
                        <RemoveStoryboard BeginStoryboardName="shrinkStoryBoard"></RemoveStoryboard>
                     </DataTrigger.ExitActions>
                  </DataTrigger>
               </Style.Triggers>
            </Style>
         </Border.Style>
         <TextBlock TextWrapping="Wrap" Text="{Binding LeftMenuVisible}"/>
      </Border>
      <Border Width="10" Background="Gray">
         <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseLeftButtonDown">
               <ei:CallMethodAction TargetObject="{Binding}" MethodName="ChangeVisible"/>
            </i:EventTrigger>
         </i:Interaction.Triggers>
      </Border>
      <Grid/>
   </DockPanel>
</Window>

Wesentliche Änderungen:

  • DataTrigger.ExitActions definiert
  • Bei der Vergrößern Animation noch ein "from" eingebaut, da beim Reset des vorigen Triggers die Breite wieder den Ursprungswert von 230 hat und somit nichts mehr zu tun ist.

Lg, XXX

D
deinChef Themenstarter:in
2 Beiträge seit 2009
vor 8 Jahren

Hallo XXX,

Ich danke dir, das mit ExitActions hab ich mir schon gedacht das ich dort noch was definieren muss aber ein RemoveStoryboard wäre mir im leben nicht eingefallen 😁

Funktioniert jetzt alles 😉

Nochmal danke schön!

Gruß
Jeffrey

Probleme sind zum Lösen da!