2013-06-28 22 views
8

Sto cercando di creare un trigger di dati stile semplice che tira è vincolante il valore da una proprietà ViewModel, come potete vedere qui sotto:DataTrigger legame ViewModel proprietà

 <StackPanel Name="stackTextPanel" Orientation="Horizontal" Margin="0,8,0,0"> 
      <StackPanel.Style> 
       <Style TargetType="{x:Type StackPanel}"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding QuickDrawBarPinned}" Value="False"> 
          <Setter Property="Margin" Value="0,8,0,0" /> 
         </DataTrigger> 
         <DataTrigger Binding="{Binding QuickDrawBarPinned}" Value="True"> 
          <Setter Property="Margin" Value="0,48,0,0" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </StackPanel.Style> 

Ho anche provato la variante

ma questo non funziona ancora quando premo il pulsante che cambia la proprietà QuickDrawBarPinned cosa sto facendo male?

Ho implementato la proprietà come così:

private bool _quickDrawBarPinned = false; 
    /// <summary> 
    /// Indicates if the Quick Draw Bar is pinned (stuck) or unpinned (retractable) 
    /// </summary> 
    public bool QuickDrawBarPinned 
    { 
     get { return _quickDrawBarPinned; } 
     set 
     { 
      _quickDrawBarPinned = value; 
      OnPropertyChanged("QuickDrawBarPinned"); 
     } 
    } 

questo è il metodo che implementa il controllo delle modifiche

public virtual void OnPropertyChanged(string propertyInfo) 
    { 
     App.Current.Dispatcher.BeginInvoke((Action)(() => 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyInfo)); 
      } 
     } 
     )); 
    } 

risposta

13

Credo che bisogna rimuovere lo stile locale per il vostro margine di

<StackPanel Name="stackTextPanel" Orientation="Horizontal"> 
     <StackPanel.Style> 
      <Style TargetType="{x:Type StackPanel}"> 
       <Setter Property="Margin" Value="0,8,0,0" /> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding QuickDrawBarPinned}" Value="False"> 
         <Setter Property="Margin" Value="0,8,0,0" /> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding QuickDrawBarPinned}" Value="True"> 
         <Setter Property="Margin" Value="0,48,0,0" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </StackPanel.Style> 
+0

Bingo, grazie! Penso che sia stata una combinazione di entrambe le risposte che mi ha aiutato, ho dimenticato di includere prima la notifica di modifica, in quanto avevo già provato a rimuovere la proprietà del margine locale e non ha funzionato. Quindi, implementando entrambe le risposte, ho risolto il problema, grazie! – MikeDub

1

Si può perdere la notifica nel cambiamento di proprietà. Si prega di confermare se il vostro ViewModel implementare l'INotifyPropertyChanged,

public class ViewModel : INotifyPropertyChanged 
{ 
    private bool quickDrawBarPinned; 

    public bool QuickDrawBarPinned 
    { 
     get { return quickDrawBarPinned; } 
     set { quickDrawBarPinned = value; RaisePropertyChanged("QuickDrawBarPinned"); } 
    } 

    public void RaisePropertyChanged(string propertyname) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyname)); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 
+1

Ho aggiornato la questione per includere ulteriori informazioni sulla mia soluzione/problema che lo implementa. – MikeDub

Problemi correlati