Расположение окна привязки не работает в двух направлениях - PullRequest
0 голосов
/ 27 января 2012

Я пытаюсь сохранить местоположение окна, у меня есть следующий XAML (не относящиеся к делу части удалены)

<Window x:Class="App.MainWindow"
  Title="MainWindow" Name="mainWindow"
  Top="{Binding Source={StaticResource Settings}, Path=Default.PositionY}"
  Left="{Binding Source={StaticResource Settings}, Path=Default.PositionX}"
  AllowsTransparency="True" WindowStyle="None" SizeToContent="WidthAndHeight"
  Background="#01000000" Topmost="{Binding Source={StaticResource Settings}, Path=Default.AlwaysOnTop}"
   MouseLeftButtonDown="mainWindow_MouseLeftButtonDown" 

«Настройки» определены в App.xaml и соответствуют настройкам приложения

Поиск в Google дает несколько примеров этого, используя именно тот метод, который я использовал.

Привязка TopMost работает точно так же, как и ожидалось, это значение сохраняется между запусками Связывание Top и Left, однако, работает только в одном направлении. Окно правильно выбирает свое местоположение из настроек, но при перемещении настройки не обновляются. Точка останова в моей функции Settings.Save показывает, что свойства Top и Left изменились, как и ожидалось. Копирование этих значений вручную перед сохранением работает нормально. Я попытался явно указать Mode = TwoWay безрезультатно (в любом случае должен быть по умолчанию)

PositionX и PositionY - пользовательские настройки, определенные как тип double

Перемещение окна осуществляется с помощью следующего обработчика мыши

private void mainWindow_MouseLeftButtonDown(object sender, MouseButtonEventArgs args)
{
  DragMove();
}

Есть идеи, почему двусторонняя привязка работает только в одну сторону?

Ответы [ 3 ]

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

Ну, это действительно не работает без явной настройки TwoWay. Я только что попробовал это:

Top="{Binding Source={StaticResource Settings}, Path=Default.PositionY, Mode=TwoWay}" 
Left="{Binding Source={StaticResource Settings}, Path=Default.PositionX, Mode=TwoWay}" 

и это делает работу.

Относительно INotifyPropertyChanged: это не обязательно, потому что это другое направление привязки, то есть то, которое работает один раз при запуске. И, возможно, это трудно реализовать в сгенерированном классе.

1 голос
/ 27 января 2012

Что сказал Колин: заставьте вас правильно реализовать интерфейс INotofiyPropertyChanged. Будет полезно, если вы поделитесь с нами кодом вашего класса настроек.

НО также убедитесь, что вы указали свой режим привязки Mode=TwoWay, который НЕ по умолчанию, как вы предлагаете в своем вопросе.

0 голосов
/ 27 января 2012

Для обновления привязок объект, который предоставляет свойства PositionY и PositionX, должен реализовать интерфейс INotifyPropertyChanged и вызвать событие PropertyChanged при изменении этих двух свойств. Вы не показали эту часть своего кода, но я предполагаю, что вы этого не делаете.

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