Привязка TextBlock обновляется только один раз в начале - PullRequest
0 голосов
/ 18 июня 2020

В моем файле .xaml есть текстовый блок, который я привязал к свойству. Также есть 2 кнопки для ++ и - значение этого свойства при нажатии. Проблема в том, что привязка работает только при старте приложения.

При нажатии кнопки выполняется соответствующая команда, и переменная меняет свое значение в коде (так что нет проблем с выполнением данных методов).

Однако никаких изменений в UI. Я не уверен, в чем может быть причина, пользовательский интерфейс каким-то образом заблокирован? Я всегда работал с использованием метода MVVM, и у меня никогда не было такой проблемы с привязкой.

Если потребуется больше кода, дайте мне знать, я не хотел помещать здесь огромную стену кода. 1008 * Конструктор:

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;

        Zoom = 60;

        ZoomPlusSceneCommand = new RelayCommand(ZoomPlus);
        ZoomMinusSceneCommand = new RelayCommand(ZoomMinus);
    }

Изменено свойство обработки:

    public event PropertyChangedEventHandler PropertyChanged;

    public void RaisePropertyChanged(string propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

Само свойство:

    private int zoom;
    public int Zoom
    {
        get { return zoom; }
        set { if (zoom != value) { zoom = value; RaisePropertyChanged("Zoom"); } }
    }

Команды:

    public RelayCommand ZoomPlusSceneCommand { get; set; }
    public RelayCommand ZoomMinusSceneCommand { get; set; }

где RelayCommand - это реализация, которую я использую в качестве шаблона в большинстве своих проектов, и они всегда работали хорошо (по крайней мере, в проектах MVVM).

Методы, выполняемые с использованием команд, когда нажата кнопка:

    private void ZoomPlus(object o)
    {
        Zoom++;
    }
    private void ZoomMinus(object o)
    {
        Zoom--;
    }

Xaml:

<Window x:Class="Rendering3D.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:Rendering3D"
    Loaded="GetSceneSize"
    ResizeMode="NoResize"
    mc:Ignorable="d"
    Title="MainWindow" Height="550" Width="900">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="10"/>
        <ColumnDefinition x:Name="SceneColumn" Width="*"/>
        <ColumnDefinition Width="10"/>
        <ColumnDefinition Width="40"/>
        <ColumnDefinition Width="10"/>
    </Grid.ColumnDefinitions>

    <Grid.RowDefinitions>
        <RowDefinition Height="10"/>
        <RowDefinition x:Name="SceneRow" Height="*"/>
        <RowDefinition Height="10"/>
    </Grid.RowDefinitions>

    <Image x:Name="SceneImage" Grid.Column="1" Grid.Row="1" 
           PreviewMouseLeftButtonDown="SceneMouseLeftButtonDown" 
           MouseMove="SceneMouseMove"
           MouseWheel="SceneMouseWheel"/>

    <Grid Grid.Column="3" Grid.Row="1">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="10"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="10"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>

        <Grid.Resources>
            <Style TargetType="Button">
                <Setter Property="Padding" Value="0 5 0 5"/>
            </Style>
        </Grid.Resources>

        <Button Grid.Row="0" Content="+" Command="{Binding ZoomPlusSceneCommand}"/>
        <Button Grid.Row="2" Content="-" Command="{Binding ZoomMinusSceneCommand}"/>
        <Label  Grid.Row="4" Content="Zoom" HorizontalAlignment="Center"/>
        <TextBlock Grid.Row="5" Text="{Binding Zoom}" HorizontalAlignment="Center"/>
    </Grid>
</Grid>

Пример события мыши:

    private void SceneMouseWheel(object sender, MouseWheelEventArgs e)
    {
        if (e.Delta > 0)
            Zoom++;
        else
            Zoom--;

        return;
    }

1 Ответ

1 голос
/ 18 июня 2020

Предполагая, что свойство установлено, представление должно быть обновлено при условии, что ваш MainWindow класс действительно реализует INotifyPropertyChanged:

public partial class MainWindow : Window, INotifyPropertyChanged
...
...