c# WPF координаты окна в рамках MVVM

284
20 ноября 2017, 16:52

В WPF у окна есть несколько свойств, отвечающие за его расположение на экране: Left, Top. Как в рамках MVVM изменять эти свойства, учитывая, что обычная привязка не работает, т.к. вылетает исключение????

Answer 1

Скорее всего, у вас ошибка в привязке. Вот рабочий пример, всё прекрасно привязывается.

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, и положение окна подхватывает их:

Answer 2

Проблема решена. 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>
READ ALSO
Странности приведения .Net 4.6.1

Странности приведения .Net 4.6.1

Чтобы не вдаваться в детали самого кода, приведу более абстрактную ситуациюКак мы все прекрасно знаем, следующий код вполне себе рабочий:

205
Ошибка sql запроса, где проблема?

Ошибка sql запроса, где проблема?

Вопрос не актуален

306