WPF Привязать WindowState к команде в UserControl - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь создать настраиваемую строку заголовка для использования в приложениях WPF, частично для того, чтобы научиться / попрактиковаться в использовании пользовательских контролей. Я сделал то, что мне нужно, чтобы привязать команду в модели представления usercontrol к свойству (windowstate) главного окна и нажатию кнопки, но хотя команда выполняется при нажатии кнопки, состояние windows главное окно, содержащее usercontrol, не изменяется.

Есть ли что-то, чего я не понял в связи здесь? Я чувствую, что я следовал всем инструкциям, которые я мог найти онлайн к письму! (очевидно, у меня нет)

Вот пользовательский контроль xaml:

<UserControl x:Class="UserControls.TitleBar"
             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:vm="clr-namespace:ViewModels"
             mc:Ignorable="d">
    <UserControl.DataContext>
        <vm:TitleBar_ViewModel/>
    </UserControl.DataContext>
    <Button Command="{Binding MaximiseCommand}" />
</UserControl>

и код в модели представления выглядит следующим образом:

namespace ViewModels
{
    public class TitleBar_ViewModel : DependencyObject, INotifyPropertyChanged
    {
        public TitleBar_ViewModel() { }
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
        private WindowState _windowState;
        public WindowState WindowState
        {
            get
            { return _windowState; }
            set
            {
                _windowState = value;
                OnPropertyChanged();
            }
        }

        private ICommand _maximiseCommand;

        public ICommand MaximiseCommand
        {
            get
            {
                if (_maximiseCommand == null)
                {
                    _maximiseCommand = new RelayCommand(param => this.Maximise(), param => true);
                }
                return _maximiseCommand;
            }
        }
        private void Maximise()
        {
            WindowState = WindowState.Maximized;
        }
    }
}

xaml для главного окна, которое использует usercontrol, выглядит следующим образом:

<Window x:Class="Demo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:uc="clr-namespace:UserControls;assembly=UserControls"
        mc:Ignorable="d"
        WindowState="{Binding WindowState,ElementName=Titlebar}">
    <Grid>
        <uc:TitleBar x:Name="Titlebar"/>
    </Grid>
</Window>

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

Любые указатели будут великолепны; такое использование пользовательских элементов управления действительно выбрасывает меня, и я действительно хочу начать использовать его, чтобы избежать повторного копирования кода для каждого приложения!

1 Ответ

1 голос
/ 25 июня 2019

У вашего Usercontrol нет свойства WindowState, но DataContext. Итак:

WindowState="{Binding DataContext.WindowState,ElementName=Titlebar}"
...