Я пытаюсь создать настраиваемую строку заголовка для использования в приложениях 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>
Для этой демонстрации я сохранил все настолько простым, насколько это возможно, так что, надеюсь, вы сможете дать некоторые указания относительно какой-то важной части процесса сборки, которую я пропустил, что приводит к тому, что состояние окна главного окна не затрагивается нажатие кнопки.
Любые указатели будут великолепны; такое использование пользовательских элементов управления действительно выбрасывает меня, и я действительно хочу начать использовать его, чтобы избежать повторного копирования кода для каждого приложения!