【问题标题】:How to change the menu content by using DataTrigger in XAML?如何在 XAML 中使用 DataTrigger 更改菜单内容?
【发布时间】:2016-04-04 06:50:40
【问题描述】:

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

bool IsAdmin {get; set;}

我要更改菜单项内容。我不熟悉数据模板。我想在 xaml 本身中定义所有菜单项(可能正在使用数据模板)。 我们如何使用数据触发器绑定不同的菜单项。 任何人都可以为此举一个更小的例子。仅使用此属性,不使用 c# 代码。

【问题讨论】:

  • 如果我的回答有帮助,请在 cmets 中更新我

标签: wpf xaml mvvm menu datatemplate


【解决方案1】:

使用 ContentControlStyles 在管理员或非管理员视图之间更改视图的最大灵活性

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

请记住,您必须在您的VM 上实现INPC 接口才能动态更改状态(是否为管理员)。否则,更改将只被接受一次(在创建持有 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;
    }
}

【讨论】:

  • Value="1" 到底是什么?
  • 如果 IsAdmin == True 在 XAML 中
  • 是的。确实如此。谢谢大哥回答。它对我有用:)
  • @llan,通过我的 stackoverflow 个人资料将我添加到 LinkedIn
  • OnPropertyChanged() 我用过。我只是给出了那个简单的演示示例。 @伊兰
猜你喜欢
  • 2018-06-14
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
相关资源
最近更新 更多