Свойство видимости не работает, если я установил datacontext и наоборот - PullRequest
0 голосов
/ 05 ноября 2018

Я хочу, чтобы пользовательский элемент управления отображался при выборе меню.

Каждый раз, когда пользователь щелкает меню видения, отображается пользовательский элемент управления AV_Credentials. Но я не могу сделать datacontext для нового пользовательского элемента управления.

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. Там пользователь предоставит некоторые данные.

Что не так

Часть видимости работает нормально, но кнопки и текстовые поля в пользовательском контроле не работают. Если я назначаю текстовый текст, кнопка и текстовые поля работают, но видимость не работает.

При необходимости я могу поделиться AV_Credential .xaml и .cs

Извините за плохой английский

1 Ответ

0 голосов
/ 05 ноября 2018

Если я назначаю текстовый текст, кнопка и текстовые поля работают, но видимость не работает.

Добавить "AV_Context." к путям связывания в AV_Credentials.xaml, например:

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

Это должно работать, поскольку DataContext элемента управления AV_Credentials является Menu_ViewModel, а этот тип имеет свойство AV_Context.

Вы не должны явно устанавливать DataContext UserControl, поскольку тогда привязка к свойству Menu_ViewModel Cred не будет выполнена, как вы уже обнаружили.

Другой вариант - указать явный источник для привязки Visibility:

<local:AV_Credentials Visibility="{Binding Path=DataContext.Cred, RelativeSource={RelativeSource AncestorType=UserControl}}" 
                      DataContext="{Binding AV_Context}"/>
...