Wpf 如何在XAML中使用DataTrigger更改菜单内容?

Wpf 如何在XAML中使用DataTrigger更改菜单内容?,wpf,xaml,mvvm,menu,datatemplate,Wpf,Xaml,Mvvm,Menu,Datatemplate,根据登录名,我有两种菜单项。因此,通过使用ViewModel类中的属性 bool IsAdmin {get; set;} 我必须更改菜单项内容。我不熟悉数据模板。我想定义xaml本身中的所有菜单项(可能使用数据模板)。 如何使用数据触发器绑定不同的菜单项。 任何人都可以举一个较小的例子。仅使用此属性,不使用c#代码。使用ContentControl和样式可以最大限度地灵活地更改视图,包括管理视图和非管理视图 <UserControl.Resources> <!--**

根据登录名,我有两种菜单项。因此,通过使用ViewModel类中的属性

bool IsAdmin {get; set;}
我必须更改菜单项内容。我不熟悉数据模板。我想定义xaml本身中的所有菜单项(可能使用数据模板)。 如何使用数据触发器绑定不同的菜单项。
任何人都可以举一个较小的例子。仅使用此属性,不使用c#代码。

使用ContentControl样式可以最大限度地灵活地更改视图,包括管理视图和非管理视图

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

请记住,您必须在计算机上实现接口,以便能够动态更改状态(是否为admin)。否则,更改将只接受一次(在创建持有IsAdmin属性的类时)。以下是INPC实现示例:

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;
    }
}
公共类UserControlDataContext:BaseObserveObject
{
私人秘书处;
公共图书馆
{
获取{return\u isAdmin;}
设置
{
_isAdmin=值;
OnPropertyChanged();
}
}
}
/// 
///实现INotifyPropertyChanged(.net 4.5)
/// 
公共类BaseObserveObject:INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
受保护的虚拟void OnPropertyChanged([CallerMemberName]字符串propertyName=null)
{
var handler=PropertyChanged;
if(handler!=null)handler(这是新的PropertyChangedEventArgs(propertyName));
}
受保护的虚拟void OnPropertyChanged(表达式提升器)
{
var propName=((MemberExpression)raiser.Body).Member.Name;
OnPropertyChanged(propName);
}
受保护的布尔集合(参考T字段,T值,[CallerMemberName]字符串名称=null)
{
如果(!EqualityComparer.Default.Equals(字段,值))
{
字段=值;
OnPropertyChanged(名称);
返回true;
}
返回false;
}
}

如果我的答案有帮助,请在注释中更新我该值=“1”到底是什么?如果在XAMLYes中为IsAdmin==True。没错。谢谢你的回答,兄弟。它适用于我:)@llan,通过我使用的stackoverflow profileOnPropertyChanged()将我添加到LinkedIn中。我只是举了一个简单演示的例子@宜兰