Ошибка привязки при привязке к свойству Width окна MainView - PullRequest
2 голосов
/ 13 января 2012

У меня есть окно MainView, ширину и высоту которого я пытаюсь связать с его классом Code-Behind.

<Window x:Class="RpP25.MainView"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:shared="http://schemas.actiprosoftware.com/winfx/xaml/shared"     
   xmlns:docking="http://schemas.actiprosoftware.com/winfx/xaml/docking"
   xmlns:themes="http://schemas.actiprosoftware.com/winfx/xaml/themes"
   xmlns:RpWin="clr-namespace:RpP25"
   xmlns:RpWinCmds="clr-namespace:RpP25.Commands"
   xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase"
   Title="{Binding Path=FileName, Converter={StaticResource WindowTitleNameConverter}}"
   Height="{Binding Path=WindowHeight, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
   Width="{Binding Path=WindowWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
   Icon="images/CobWhite.ico"
   Loaded="Window_Loaded"
   Closing="Window_Closing">

Код Code имеет свойства, а также устанавливает текст данных для ViewModel MainVM.

public partial class MainView : Window, INotifyPropertyChanged
{
    // Constant Fields
    private const double windowDefaultWidth_ = 720;
    private const double windowDefaultHeight_ = 400;

    // Private Fields
    private RegistryKey RegKey_;                                // Registry Key to hold Registry Subkey
    private WindowState windowState_ = WindowState.Normal;   // Display State of the MainWindow (Min,Max or Normal)
    private double windowWidth_ = windowDefaultWidth_;    // Width of the MainWindow
    private double windowHeight_ = windowDefaultHeight_;  // Height of the MainWindow

    #region Constructors

    public MainView()
    {
        InitializeComponent();
        DataContext = new MainVM();

        // Get the state of the window and the width/height from the registry
        ReadRegistryValues();

    /// <summary>
    /// Gets the Width of the Window
    /// </summary>
    public double WindowWidth
    {
        get { return windowWidth_; }
        set { windowWidth_ = value; NotifyPropertyChanged("WindowWidth"); }
    }

    /// <summary>
    /// Gets the Height of the Window
    /// </summary>
    public double WindowHeight
    {
        get { return windowHeight_; }
        set { windowHeight_ = value; NotifyPropertyChanged("windowHeight"); }
    }

    ...
}

Это окно создается из App::OnStartup().

Когда я запускаю код, отладчик выдает следующую ошибку в окне вывода.

Невозможнонайти источник для привязки со ссылкой 'RelativeSource FindAncestor, AncestorType =' System.Windows.Window ', AncestorLevel =' 1 ''.BindingExpression: Path = WindowHeight;DataItem = NULL;Целевым элементом является 'MainView' (Name = '');Свойство target - «Высота» (тип «Double»)

и аналогичное для WindowWidth.

. Мне показалось, что я понимаю режимы привязки, но, похоже, я ошибался: (

Я думал, что использование FindAncestor для поиска окна заставит его искать визуальное дерево, пока не будет найдено окно MainView, в котором есть мои свойства.

Любая помощь будетОЧЕНЬ признателен.

1 Ответ

2 голосов
/ 13 января 2012

try

Width="{Binding Path=WindowWidth, RelativeSource={RelativeSource Self}}"

Codebehind - это тот же элемент, что и ваше окно.Так что используйте Self привязки.

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