如果我设置了datacontext,则可见性属性不起作用,反之亦然

时间:2018-11-05 08:03:51

标签: c# wpf mvvm datacontext

我希望每当菜单被选中时,用户控件就可见。

每当用户单击视觉菜单时,都会显示AV_Credentials用户控件。但是我无法为新的用户控件做数据上下文。

Menu.xaml

<UserControl x:Class="Connector.Views.Menu"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:Connector.Views"
         xmlns:menuViewModel="clr-namespace:Connector.ViewModel.Menu"
         xmlns:ViewModel="clr-namespace:Connector.ViewModel.AV_Credentials"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="350">
<UserControl.DataContext>
    <menuViewModel:Menu_ViewModel/>
</UserControl.DataContext>
<Grid>
    <StackPanel>
        <Menu HorizontalAlignment="Stretch" VerticalAlignment="Top" >
            <MenuItem Header="Credentials">
                <MenuItem Header="vision"  Command="{Binding Vision}"/>
                <MenuItem Header="NOP" Command="{Binding NOP}"/>
            </MenuItem>
            <MenuItem Header="Sync"/>
        </Menu>
        <local:AV_Credentials Visibility="{Binding Path=AVCred}" DataContext="{Binding AV_Context}"/>
    </StackPanel>
</Grid>

Menu_ViewModel.cs

class Menu_ViewModel : INotifyPropertyChanged
{
    private AV_Credentials_ViewModel _av_Context;
    public AV_Credentials_ViewModel AV_Context
    {
        get
        {
            if(_av_Context == null)
            {
                _av_Context = new AV_Credentials_ViewModel();
            }
            return _av_Context;
        }
    }

    private Visibility _cred = Visibility.Hidden;
    public Visibility Cred
    {
        get
        {
            return _cred;
        }
        set
        {
            _cred = value; OnPropertyChanged("Cred");
        }
    }

    private ICommand mUpdater;
    public ICommand vision
    {
        get
        {
            if (mUpdater == null)
                mUpdater = new Updater(this);
            return mUpdater;
        }
        set
        {
            mUpdater = value;
        }
    }

    private class Updater : ICommand
    {
        private Menu_ViewModel obj;
        public Updater(Menu_ViewModel _obj)
        {
            obj = _obj;
        }
        #region ICommand Members

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public event EventHandler CanExecuteChanged;

        public void Execute(object parameter)
        {
            obj.ShowAVCred();
        }

        #endregion
    }

    public void ShowAVCred()
    {
        Cred = Visibility.Visible;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

我想达到的目标是-

  1. 菜单将为空白。
  2. 当用户从菜单中选择视觉时,用户控件将显示在菜单中。
  3. 那里的用户将提供一些数据。

有什么问题

可见性部分工作正常,但是用户控件中的按钮和文本框不起作用。如果我分配datacontext,则按钮和文本框都可以使用,但是可见性不可用。

如果需要,我可以共享AV_Credential .xaml和.cs

对不起,英语不好

1 个答案:

答案 0 :(得分:1)

  

如果我分配了datacontext,则按钮和文本框都可以使用,但是可见性不可用。

添加“ AV_Context”。到AV_Credentials.xaml中的绑定路径,例如:

<TextText Text="{Binding AV_Context.YourProperty}" />

这应该起作用,因为DataContext控件的AV_CredentialsMenu_ViewModel,并且此类型具有AV_Context属性。

您不应显式设置DataContext的{​​{1}},因为那样就无法绑定到UserControl的{​​{1}}属性,因为您已经发现了。

另一种选择是为Menu_ViewModel绑定指定一个明确的来源:

Cred