2016-04-04 10 views
1

Ich habe zwei Arten von Menüpunkten nach dem Login. Also, indem Sie die Eigenschaft in der Klasse Ansichtsmodell mitWie kann der Menüinhalt mithilfe von DataTrigger in XAML geändert werden?

bool IsAdmin {get; set;} 

muß ich das Menü ändern Artikel content.I ist nicht mit Datenvorlage vertraut. Ich möchte alle Menüelemente in der XAML selbst definieren (möglicherweise mit den Datenvorlagen). Wie können wir die verschiedenen Menüpunkte mithilfe des Datenauslösers binden? Kann jemand ein kleineres Beispiel dafür geben. Verwenden Sie nur diese Eigenschaft und keine C# -Codes.

+0

mir Aktualisieren in den Kommentaren, wenn meine Antwort hilft –

Antwort

2

Verwenden Content und Styles für max Flexability in der Ansicht betwin Admin oder nicht Admin Ansichten Ändern

<UserControl.Resources> 
    <!--*********** Control templates ***********--> 
    <ControlTemplate x:Key="ViewA"> 
     <Views:AView/> 
    </ControlTemplate> 
    <ControlTemplate x:Key="ViewB"> 
     <Views:BView /> 
    </ControlTemplate> 
</UserControl.Resources> 

<Grid> 
    <ContentControl DataContext="{Binding}" Grid.Row="1"> 
     <ContentControl.Style> 
      <Style TargetType="ContentControl"> 
       <Setter Property="Template" Value="{StaticResource ViewA}" /> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path=IsAdmin}" Value="True"> 
         <Setter Property="Template" Value="{StaticResource ViewB}" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ContentControl.Style> 
    </ContentControl > 
</Grid> 

Beachten Sie bitte, dass Sie die INPC-Schnittstelle auf Ihrem VM in müssen implementieren Um den Status ändern zu können (ist admin oder nicht), wird die Änderung nur einmal akzeptiert (bei der Erstellung der Klasse, die die IsAdmin-Eigenschaft enthält). Hier ist das INPC Implementierungsbeispiel:

public class UserControlDataContext:BaseObservableObject 
{ 

    private bool _isAdmin; 

    public bool IsAdmin 
    { 
     get { return _isAdmin; } 
     set 
     { 
      _isAdmin = value; 
      OnPropertyChanged(); 
     } 
    } 
} 

/// <summary> 
/// implements the INotifyPropertyChanged (.net 4.5) 
/// </summary> 
public class BaseObservableObject : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    protected virtual void OnPropertyChanged<T>(Expression<Func<T>> raiser) 
    { 
     var propName = ((MemberExpression)raiser.Body).Member.Name; 
     OnPropertyChanged(propName); 
    } 

    protected bool Set<T>(ref T field, T value, [CallerMemberName] string name = null) 
    { 
     if (!EqualityComparer<T>.Default.Equals(field, value)) 
     { 
      field = value; 
      OnPropertyChanged(name); 
      return true; 
     } 
     return false; 
    } 
} 
+0

Was ist das Value = „1“ genau? – Ugur

+0

Ist if IsAdmin == Wahr in XAML –

+0

Ja. Das ist richtig. Danke für deine Antwort, Bruder. Es funktioniert für mich :) –