2013-06-28 18 views
8

Próbuję utworzyć wyzwalacz danych prosty styl, który ciągnie to wiązanie wartości od właściwości ViewModel, jak widać poniżej:DataTrigger wiązania z ViewModel personelem na

 <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> 

Próbowałem również wariant

Binding="{Binding Path=QuickDrawBarPinned}" 

ale to nadal nie działa, gdy naciskam przycisk zmieniający właściwość QuickDrawBarPinned co robię źle?

I zostały wdrożone jako właściwość tak:

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"); 
     } 
    } 

Jest to metoda, która implementuje kontrolę zmian

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

Odpowiedz

13

Chyba trzeba usunąć do lokalnego stylu dla marginesu

<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, dzięki! Myślę, że było to połączenie obu odpowiedzi, które mi pomogły, zapomniałem najpierw o powiadomieniu o zmianie, ponieważ wcześniej próbowałem usunąć lokalną właściwość depozytu zabezpieczającego i nie zadziałało. Realizując obie odpowiedzi rozwiązałem problem, dziękuję! – MikeDub

1

możesz przegapić zgłoszenia na zmiany własności. Proszę potwierdzić, czy ViewModel wdrożyć 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

Mam zaktualizowała pytanie zawiera więcej informacji o moje rozwiązanie problemu, który/realizuje to. – MikeDub