INotifyPropertyChanged не обновляет пользовательский интерфейс в DataTemplate, XAML, WPF - PullRequest
0 голосов
/ 08 ноября 2018

Я хочу отобразить несколько прямоугольников с некоторыми свойствами, которые я храню в массиве массивов. XAML для отображения выглядит следующим образом:

<UserControl x:Class="Project.Views.SomeView">

<UserControl.Resources>
    <DataTemplate x:Key="ObjectRowTemplate">
        <Rectangle Fill="{Binding Path=color, UpdateSourceTrigger=PropertyChanged}" Height="15" Width="30"  StrokeThickness="1px" Stroke="Blue" >
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseDown">
                    <catel:EventToCommand DisableAssociatedObjectOnCannotExecute="False">
                        <catel:EventToCommand.Command>
                            <Binding RelativeSource="{RelativeSource AncestorType={x:Type Canvas}}" Path="DataContext.ObjectClickedCommand"  />
                        </catel:EventToCommand.Command>

                        <catel:EventToCommand.CommandParameter>
                            <Binding Path="."  />
                        </catel:EventToCommand.CommandParameter>
                    </catel:EventToCommand>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Rectangle>   
    </DataTemplate>

    <DataTemplate x:Key="ObjectColumnTemplate">
        <ItemsControl ItemsSource="{Binding ., UpdateSourceTrigger=PropertyChanged}" ItemTemplate="{DynamicResource ObjectRowTemplate}" >
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
    </DataTemplate>

</UserControl.Resources>
<StackPanel>
    <Canvas Background="Black" Width="{Binding CanvasWidth}" Height="600">
        <Grid>
            <ItemsControl ItemsSource="{Binding Path=BindedProperty, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" ItemTemplate="{DynamicResource ObjectColumnTemplate}"/>
        </Grid>
    </Canvas>
</StackPanel>

есть StackPanel с холстом внутри, который показывает массив массива через два определенных DataTemplate s, создавая Rectangle для каждого "слота" в Array.

namespace ViewModels
{
    public class ViewModel : AdvancedViewModelBase
    {
        public CreateGameFieldViewModel()
        {
            ObjectClickedCommand = new Command<Object>(ObjectClicked);

            Objects = new Objects[15][];
            for (int i = 0; i < 15; i++)
            {
                Objects[i] = new Object[15];
                for (int j = 0; j < 15; j++)
                {
                    Objects[i][j] = new Object(someparams);
                }
            }
        }

        private Object _selectedObject;

        private Object[][] _object;

        public Object[][] Objects
        {
            get { return _object; }
            set
            {
                _object = value;
                RaisePropertyChanged(nameof(Objects));
            }
        }

        public int CanvasWidth { get; set; } = 450;

        public Command<OPbject> ObjectClickedCommand { get; set; }

        public void ObjectClicked(Object object)
        {
            if (object != null)
            {
                _selectedObject = object;
            }
        }

        public void OnKeyDown(KeyEventArgs e)
        {
            // Modify _currentObject
            _currentObject.color = Brushes.Blue;

            RaisePropertyChanged(nameof(Objects));
        }
    }
}

Привязка свойств с моделью представления работает нормально, свойства установлены так, как определено. Нажав на Rectangle, объект, к которому привязан, теперь устанавливается как _selectedObject и может быть изменен с помощью клавиш со стрелками, который также работает как шарм.

Поскольку я изменил один объект массива массивов, который я связываю с DataTemplate, я должен уведомить мой пользовательский интерфейс, который я делаю, к этой строке RaisePropertyChanged(nameof(Objects)); (использовал Nuget: Catel) после модификации.

К сожалению, пользовательский интерфейс не обновляется. Я все проверил, объект в массиве массивов содержит модификации.

Полагаю, это не работает из-за DataTemplate s, которые я использовал.

Кто-нибудь может мне помочь?

...