В WPF у окна есть несколько свойств, отвечающие за его расположение на экране: Left, Top. Как в рамках MVVM изменять эти свойства, учитывая, что обычная привязка не работает, т.к. вылетает исключение????
Скорее всего, у вас ошибка в привязке. Вот рабочий пример, всё прекрасно привязывается.
VM-часть:
class MainVM : VM
{
double x, y;
public double X { get => x; set => Set(ref x, value); }
public double Y { get => y; set => Set(ref y, value); }
public ICommand Run { get; }
async void Move()
{
var centerX = X;
var centerY = Y;
var R = 50;
while (true)
{
const double delta = Math.PI * 10 / 180;
for (double angle = 0; angle < 2 * Math.PI; angle += delta)
{
X = centerX + R * Math.Cos(angle);
Y = centerY + R * Math.Sin(angle);
await Task.Delay(TimeSpan.FromMilliseconds(50));
}
}
}
public MainVM() { Run = new RelayCommand(o => Move()); }
}
XAML:
<Window x:Class="TestApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Тест" Height="250" Width="250"
Top="{Binding X, Mode=TwoWay}" Left="{Binding Y, Mode=TwoWay}">
<StackPanel Orientation="Vertical"
HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock>
<Run Text="Position: ("/><!--
--><Run Text="{Binding X, StringFormat=0.00, Mode=OneWay}"/><!--
--><Run Text=", "/><!--
--><Run Text="{Binding Y, StringFormat=0.00, Mode=OneWay}"/><!--
--><Run Text=")"/>
</TextBlock>
<Button Command="{Binding Run}">Run</Button>
</StackPanel>
</Window>
Сначала я перемещаю окно, и VM-координаты обновляются автоматически. Затем я меняю координаты в VM, и положение окна подхватывает их:
Проблема решена. XAML разметка:
<Window.Resources>
<SpeechPoker:MainViewModel x:Key="MVM"/>
<local:BoolToProfitConverter x:Key="ProfitConverter" />
<local:BooleanToVisibilityConverter x:Key="VisibleConverter" />
</Window.Resources>
<Window.Left>
<Binding Path="Left" Source="{StaticResource MVM}" Mode="TwoWay"/>
</Window.Left>
<Window.Top>
<Binding Path="Top" Source="{StaticResource MVM}" Mode="TwoWay"/>
</Window.Top>
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Чтобы не вдаваться в детали самого кода, приведу более абстрактную ситуациюКак мы все прекрасно знаем, следующий код вполне себе рабочий: