Как установить свойство зависимости, объявленное в коде - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь привязать значение из класса ViewModel к пользовательскому свойству, объявленному в коде позади класса Window. В этом примере я получаю следующее: «Пользователь FullScreen не распознан или недоступен». error.

Вот класс MainWindow:

public partial class MainWindow : Window
    {
        public static readonly DependencyProperty FullScreenProperty =
            DependencyProperty.Register(nameof(FullScreen), typeof(bool),
                typeof(MainWindow), new PropertyMetadata(default(bool), PropertyChangedCallback));

        public bool FullScreen
        {
            get => (bool)GetValue(FullScreenProperty);
            set => SetValue(FullScreenProperty, value);
        }

        private static void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var value = (bool)e.NewValue;
            //this.GoToFullScreen(value);
        }

        public MainWindow()
        {
            InitializeComponent();
        }
    }

И часть XAML:

<Window x:Class="WindowDependencyPropertyTest.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:local="clr-namespace:WindowDependencyPropertyTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800" FullScreen="{Binding FullScreenFromVm}" >
    <Grid>

    </Grid>
</Window>

Каков наилучший способ достижения этой функциональности?

Ответы [ 2 ]

1 голос
/ 15 января 2020

При условии, что для MainWindow DataContext задан объект со свойством FullScreenFromVm, это должно работать:

<Window x:Class="WindowDependencyPropertyTest.MainWindow" ...>
    <Window.Style>
        <Style>
            <Setter Property="local:MainWindow.FullScreen"
                    Value="{Binding FullScreenFromVm}"/>
        </Style>
    </Window.Style>
    ...
</Window>

Или вы привязываете свойство в конструкторе MainWindow:

public MainWindow()
{
    InitializeComponent();
    SetBinding(FullScreenProperty, new Binding("FullScreenFromVm"));
}
1 голос
/ 15 января 2020

Вы можете создать собственное окно и добавить в него свойство зависимости

public class CustomWindow : Window
{
    // propdp FullScreenFromVm ...
}

Тогда вам просто нужно изменить

<Window ... >

на

<local:CustomWindow ... FullScreen="{Binding FullScreenFromVm}">

и изменить базовый класс окна

public partial class MainWindow : CustomWindow
{
   ...
}

Таким образом, свойство зависимости доступно в xaml.


Изначально я думал, что вы можете просто написать <local:MainWindow ...>, чтобы получить доступ к определенному свойству зависимости, но, к сожалению, это нарушает генерацию кода, потому что x:Class ожидает, что содержащий тип будет base class.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...