Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
3 / 3 / 0
Регистрация: 23.12.2016
Сообщений: 273

Binding к вложенным свойствам (ко свойству базового класса), ошибка: "Ключ не может быть неопределенным. Имя параметра: key"

15.06.2025, 17:23. Показов 3863. Ответов 42

Студворк — интернет-сервис помощи студентам
Здравствуйте, есть базовый класс, от которого унаследованы 2 других, и в базовом есть 1 свойство , которое должно присутствовать в 2-х наследниках и во время работы приложения изменяться. Но возникает ошибка:
System.ArgumentNullException: "Ключ не может быть неопределенным.
Имя параметра: key"
Кликните здесь для просмотра всего текста

"at System.Collections.Specialized.HybridDic tionary.get_Item(Object key)\r\n at System.ComponentModel.PropertyChangedEve ntManager.AddListener(INotifyPropertyCha nged source, String propertyName, IWeakEventListener listener, EventHandler`1 handler)\r\n at System.ComponentModel.PropertyChangedEve ntManager.AddHandler(INotifyPropertyChan ged source, EventHandler`1 handler, String propertyName)\r\n at MS.Internal.Data.PropertyPathWorker.Repl aceItem(Int32 k, Object newO, Object parent)\r\n at MS.Internal.Data.PropertyPathWorker.Upda teSourceValueState(Int32 k, ICollectionView collectionView, Object newValue, Boolean isASubPropertyChange)\r\n at MS.Internal.Data.ClrBindingWorker.Attach DataItem()\r\n at System.Windows.Data.BindingExpression.Ac tivate(Object item)\r\n at System.Windows.Data.BindingExpression.At tachToContext(AttachAttempt attempt)\r\n at System.Windows.Data.BindingExpression.MS .Internal.Data.IDataBindEngineClient.Att achToContext(Boolean lastChance)\r\n at MS.Internal.Data.DataBindEngine.Task.Run (Boolean lastChance)\r\n at MS.Internal.Data.DataBindEngine.Run(Obje ct arg)\r\n at MS.Internal.Data.DataBindEngine.OnLayout Updated(Object sender, EventArgs e)\r\n at System.Windows.ContextLayoutManager.fire LayoutUpdateEvent()\r\n at System.Windows.ContextLayoutManager.Upda teLayout()\r\n at System.Windows.ContextLayoutManager.Upda teLayoutCallback(Object arg)\r\n at System.Windows.Media.MediaContext.Invoke OnRenderCallback.DoWork()\r\n at System.Windows.Media.MediaContext.FireIn vokeOnRenderCallbacks()\r\n at System.Windows.Media.MediaContext.Render MessageHandlerCore(Object resizedCompositionTarget)\r\n at System.Windows.Media.MediaContext.Render MessageHandler(Object resizedCompositionTarget)\r\n at System.Windows.Media.MediaContext.Resize (ICompositionTarget resizedCompositionTarget)\r\n at System.Windows.Interop.HwndTarget.OnResi ze()\r\n at System.Windows.Interop.HwndTarget.Handle Message(WindowMessage msg, IntPtr wparam, IntPtr lparam)\r\n at System.Windows.Interop.HwndSource.HwndTa rgetFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)\r\n at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)\r\n at MS.Win32.HwndSubclass.DispatcherCallback Operation(Object o)\r\n at System.Windows.Threading.ExceptionWrappe r.InternalRealCall(Delegate callback, Object args, Int32 numArgs)\r\n at System.Windows.Threading.ExceptionWrappe r.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)\r\n at System.Windows.Threading.Dispatcher.Lega cyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)\r\n at MS.Win32.HwndSubclass.SubclassWndProc(In tPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)" string

Я понимаю, что ошибка связанна с биндингом, но никак не могу понять причины, что сделано не так.
в базовом классе реализовано свойство и интерфейс INotifyPropertyChanged (если убираю наследование от этого интерфейса все ок, ошибки нет, то и соответственно обновлений). пока нашел выход из ситуации CollectionViewSource.GetDefaultView(TableRows).Refresh(); , но думаю это не корректно в рамках WPF, когда есть binding.
Архив прикладываю. Или вообще нельзя корректно настроить binding к вложенным свойствам (свойству базового класса)?
Вложения
Тип файла: rar TwoTypeDGrid.rar (1,022.0 Кб, 23 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.06.2025, 17:23
Ответы с готовыми решениями:

Ошибка при обновлении данных "Значение не может быть неопределенным. Имя параметра: dataTable"
Задача такая. Открывыаешь окно, из БД берутся соответствующие данные. Вручную модифицируются и при...

Внешняя сортировка и ошибка "Значение не может быть неопределенным. Имя параметра: String"
Вот сама программа внешняя сортировка. Ошибка: Значение не может быть неопределенным. Имя...

Ошибка: System.ArgumentNullException: "Значение не может быть неопределенным. Имя параметра: input"
Вот код: namespace WindowsFormsApp4 { public partial class Form1 : Form { ...

42
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
16.06.2025, 23:17
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А так только вечером дома будет ком со Студией.
Andrey-MSK, фигня какая-то.
Провозился час, но не смог понять причину исключения.
Нет больше времени с этим сегодня разбираться.
Если может, то помогите IIIIIIIIIgor.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,765
Записей в блоге: 4
17.06.2025, 09:01
IIIIIIIIIgor, Вот этот метод не отрабатывает
C#
1
public override DataTemplate SelectTemplate(object item, DependencyObject container)
В него влетает item, но значение его null, и потом получаете исключение.

Значит что-то тут вы навертели
XML
1
2
3
<selectors:TableRowTemplateSelector x:Key="tableRowSelector"
                            ToolTemplate="{StaticResource DGrid1}"
                                    OperationTemplate="{StaticResource DGrid2}"/>
XML
1
2
3
<ContentControl Grid.Row="0"
                Content="{Binding}"
                ContentTemplateSelector="{StaticResource tableRowSelector}"/>
0
3 / 3 / 0
Регистрация: 23.12.2016
Сообщений: 273
17.06.2025, 09:05  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Вот этот метод не отрабатывает
я же вчера писал, что то что null сюда попадает на ошибку не влияет.
1 раз туда влетает null и возвращается null, потом происходит снова входит в этот метод, но уже с типом vm, и возвращается нужный шаблон.
ошибка возникает после 2 вхождения в этот метод. если убрать реализацию INPC то точно так же первый раз туда приходит null, но никаких ошибок нет и все биндинги отрабатывают.
Попробуйте в отладке пройти дальше, после того как в первый раз туда придет null и увидите, что ошибка возникает намного позже и не из-за этого
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,765
Записей в блоге: 4
17.06.2025, 09:25
IIIIIIIIIgor, Инициализировать item нужно до вызова селектора. Попробуйте запустить их через DI и потом уже использовать.

Добавлено через 3 минуты
Цитата Сообщение от IIIIIIIIIgor Посмотреть сообщение
Попробуйте в отладке пройти дальше
Отладка прерывается после первого исключения и начинается проверка почему оно возникло. Дальше идти смысла нет.

Добавлено через 2 минуты
IIIIIIIIIgor, И вот этот метод по дефолту возвращает null
C#
1
return base.SelectTemplate(item, container);
Добавлено через 1 минуту
IIIIIIIIIgor,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//
// Summary:
//     Provides a way to choose a System.Windows.DataTemplate based on the data object
//     and the data-bound element.
public class DataTemplateSelector
{
    //
    // Summary:
    //     When overridden in a derived class, returns a System.Windows.DataTemplate based
    //     on custom logic.
    //
    // Parameters:
    //   item:
    //     The data object for which to select the template.
    //
    //   container:
    //     The data-bound object.
    //
    // Returns:
    //     Returns a System.Windows.DataTemplate or null. The default value is null.
    public virtual DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        return null;
    }
 
    //
    // Summary:
    //     Initializes a new instance of the System.Windows.Controls.DataTemplateSelector
    //     class.
    public DataTemplateSelector()
    {
    }
}
0
3 / 3 / 0
Регистрация: 23.12.2016
Сообщений: 273
17.06.2025, 09:42  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Попробуйте запустить их через DI и потом уже использовать.
тот архив, что я скидывал это набросок показать ошибку, в настоящем проекте используется DI. и окно прекрасно заполняется, сначала строится дерево, а все привязки все работает, а вот когда происходит обращение к DG, уже когда приложение половину своих функций сделало, возникает эта ошибка. то что первый раз в селектор передается null, вообще никак не влияет на ошибку. потому что в настоящем проекте, инициализация DG, происходит уже когда и вм и все остальное создано и прекрасно работает.
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Отладка прерывается после первого исключения и начинается проверка почему оно возникло.
отладка прерывается после того как второй раз в селектор передается item, который уже не null, когда ObservableCollection заполнен и надо обновить интерфейс
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,765
Записей в блоге: 4
17.06.2025, 09:47
IIIIIIIIIgor,
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
C#
1
return base.SelectTemplate(item, container);
Этот метод уберите из селектора, он всегда возвращает null. И дальше уже ковыряйте другое исключение.
Цитата Сообщение от IIIIIIIIIgor Посмотреть сообщение
отладка прерывается после того как второй раз в селектор передается item, который уже не null, когда ObservableCollection заполнен и надо обновить интерфейс
Отладку проводят до первого исключения/неправильного значения параметра, решают вопрос и двигаются дальше. Никогда ошибки не пропускаются.
0
3 / 3 / 0
Регистрация: 23.12.2016
Сообщений: 273
17.06.2025, 10:25  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Этот метод уберите из селектора, он всегда возвращает null
null он возвращает только при 1 обращении к нему, потом возвращает нужный шаблон.
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Отладку проводят до первого исключения/неправильного значения параметра
тут ожидаемое значение null для первого запроса. так как чтобы в окно в DataContext передать VM, надо сначала создать окно, происходит его инициализация, то есть селекторы и прочее, а только потом в контекст записывается vm.

хорошо. сделал вот так:
в класс окна (код-бихаинд) добавил перед инициализацией в контекст вм
C#
1
2
3
4
5
6
7
8
9
10
11
public partial class MainWindow : Window
{
    public MainWindow()
    {
        var vm = new MainViewModel();
 
        DataContext = vm;
 
        InitializeComponent();
    }
}
теперь в TableRowTemplateSelector в метод public override DataTemplate SelectTemplate(object item, DependencyObject container) item сразу передается моя vm (не null) с первого раза не null.
и ошибка осталась точно такая же.
Тот null при первом обращении в селектор никак не влияет на ошибку
попробуйте в коде вот это изменить и вы увидите null нет, ошибка есть
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,765
Записей в блоге: 4
17.06.2025, 10:45
Цитата Сообщение от IIIIIIIIIgor Посмотреть сообщение
тут ожидаемое значение null для первого запроса.
Это не то поведение, если ожидаемое - тогда null нужно ловить и обрабатывать, а не выкидывать исключение.
Цитата Сообщение от IIIIIIIIIgor Посмотреть сообщение
а только потом в контекст записывается vm.
Да, но нужные шаблоны уже созданы, до создания VM. Селектор не должен возвращать null, он должен вернуть нужный шаблон. Если он возвращает null - значит что-то пошло не так.

Добавлено через 9 минут
IIIIIIIIIgor,
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
но нужные шаблоны уже созданы, до создания VM.
Не так выразился. Шаблоны к VM никакого отношения не имеют. Шаблоны должны быть созданы до создания объекта окна, а вот потом подключается VM и показывается окно с нужными данными.
0
3 / 3 / 0
Регистрация: 23.12.2016
Сообщений: 273
17.06.2025, 10:46  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Это не то поведение, если ожидаемое - тогда null нужно ловить и обрабатывать, а не выкидывать исключение.
исключение не выкидывается. он просто возвращает null и прекрасно идет дальше работать. Исключение возникает совершенно в другом месте и по другому поводу.

Опять же я сделал чтобы не было null , и ошибка та же самая сохранилось. снова повторяю, первый раз null в селекторе никаким боком не влияет на ошибку.

у меня складывается впечатление, что мои сообщения не читаются. просто зацепились за ни в чем не повинный null и все.
Не помогло убрать null из селектора. даже если он сразу возвращает нужный шаблон, ошибка осталась та же самая
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
17.06.2025, 11:15
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Да, но нужные шаблоны уже созданы, до создания VM. Селектор не должен возвращать null, он должен вернуть нужный шаблон.
По моему, возврат null для DataTemplateSelector.SelectTemplate - это нормальное поведение.
Я не помню чтобы у меня где-то проблемы с этим возникали.
Вечером специально протестирую.

Добавлено через 11 минут
Цитата Сообщение от IIIIIIIIIgor Посмотреть сообщение
просто зацепились за ни в чем не повинный null и все.
Я понял где возникает ошибка. Но не могу понять из-за чего.
Вчера очень поздно домой вернулся после
И не смог нормально погрузиться в тестировании.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public class TableRowObject //: INotifyPropertyChanged
    {
        private VObject _vObject;
        public VObject VObject 
        {
            get => _vObject;
            set { _vObject = value; OnPropertyChanged(); }
        }
 
        public string ToolTip { get; set; }
        public bool IsEnabled { get; set; } = true;
 
        public event PropertyChangedEventHandler PropertyChanged;
 
        protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
            => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
Andrey-MSK, вот в таком виде всё работает нормально.
Если убрать коммент public class TableRowObject : INotifyPropertyChanged, то выкидывается исключение.
К работе DataTemplateSelector это не имеет отношения, так как для свойств класса TableRowObject он не вызывается.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,765
Записей в блоге: 4
17.06.2025, 11:40
Цитата Сообщение от Элд Хасп Посмотреть сообщение
вот в таком виде всё работает нормально.
Не работает...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using TwoTypeDGrid.Models.Base;
 
namespace TwoTypeDGrid.ViewObjects
{
    //public class TableRowObject //: INotifyPropertyChanged
    //{
    //    private VObject _vObject;
    //    public VObject VObject //{ get; set; }
    //    {
    //        get => _vObject;
    //        set { _vObject = value; OnPropertyChanged(); }
    //    }
 
    //    public string ToolTip { get; set; }
    //    public bool IsEnabled { get; set; } = true;
 
    //    public event PropertyChangedEventHandler PropertyChanged;
 
    //    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    //        => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    //}
 
    public class TableRowObject //: INotifyPropertyChanged
    {
        private VObject _vObject;
        public VObject VObject
        {
            get => _vObject;
            set { _vObject = value; OnPropertyChanged(); }
        }
 
        public string ToolTip { get; set; }
        public bool IsEnabled { get; set; } = true;
 
        public event PropertyChangedEventHandler PropertyChanged;
 
        protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
            => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,765
Записей в блоге: 4
17.06.2025, 11:48
Элд Хасп, Стек вызовов такой же...
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
   at System.Collections.Specialized.HybridDictionary.get_Item(Object key)
   at System.ComponentModel.PropertyChangedEventManager.AddListener(INotifyPropertyChanged source, String propertyName, IWeakEventListener listener, EventHandler`1 handler)
   at System.ComponentModel.PropertyChangedEventManager.AddHandler(INotifyPropertyChanged source, EventHandler`1 handler, String propertyName)
   at MS.Internal.Data.PropertyPathWorker.ReplaceItem(Int32 k, Object newO, Object parent)
   at MS.Internal.Data.PropertyPathWorker.UpdateSourceValueState(Int32 k, ICollectionView collectionView, Object newValue, Boolean isASubPropertyChange)
   at MS.Internal.Data.ClrBindingWorker.AttachDataItem()
   at System.Windows.Data.BindingExpression.Activate(Object item)
   at System.Windows.Data.BindingExpression.AttachToContext(AttachAttempt attempt)
   at System.Windows.Data.BindingExpression.MS.Internal.Data.IDataBindEngineClient.AttachToContext(Boolean lastChance)
   at MS.Internal.Data.DataBindEngine.Task.Run(Boolean lastChance)
   at MS.Internal.Data.DataBindEngine.Run(Object arg)
   at MS.Internal.Data.DataBindEngine.OnLayoutUpdated(Object sender, EventArgs e)
   at System.Windows.ContextLayoutManager.fireLayoutUpdateEvent()
   at System.Windows.ContextLayoutManager.UpdateLayout()
   at System.Windows.ContextLayoutManager.UpdateLayoutCallback(Object arg)
   at System.Windows.Media.MediaContext.InvokeOnRenderCallback.DoWork()
   at System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks()
   at System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget)
   at System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompositionTarget)
   at System.Windows.Media.MediaContext.Resize(ICompositionTarget resizedCompositionTarget)
   at System.Windows.Interop.HwndTarget.OnResize()
   at System.Windows.Interop.HwndTarget.HandleMessage(WindowMessage msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Interop.HwndSource.HwndTargetFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
17.06.2025, 11:55
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Не работает...
Не вспомню сейчас...
Вроде только его комментировал и работал.
Посмотреть смогу только вечером дома.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,765
Записей в блоге: 4
17.06.2025, 12:32
Элд Хасп, Какой-то бред... Свойство объекта меняется (INPC), объект о своём изменении уведомляет (INPC). Чего ему не хватает...

Добавлено через 32 минуты
Мне кажется всё дело вот этом хитром объявлении привязки...
Code
1
Binding="{Binding VObject.(models:VObject1.ExistingCards), Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
17.06.2025, 12:56
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Какой-то бред...
Во, во...
Меня самого это в недоумение поставило.
Поэтому вчера и не смог сам быстро разобраться.
А днём на работе у меня нет компа со Студией.

Добавлено через 3 минуты
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Мне кажется всё дело вот этом хитром объявлении привязки...
Тоже может быть.
Попробуй изменить на "{Binding VObject.ExistingCards,
Полный синтаксис свойства добавлен чтобы не было предупреждений в дизайнере об ошибках привязки.

Я так делаю иногда, но первый раз наталкиваюсь на подобное исключение.
0
3 / 3 / 0
Регистрация: 23.12.2016
Сообщений: 273
17.06.2025, 13:05  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Не работает...
чтобы убрать возникновение исключения, нужно в класс VObject убрать наследование от INPC
вот при таком классе исключения нет, если раскоментировать наследование от INPC исключение появляется
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class VObject // : INotifyPropertyChanged
{
    //public string ExistingCards { get; set; }
    private string _existingCards;
    public string ExistingCards
    {
        get => _existingCards;
        set { _existingCards = value; OnPropertyChanged(); }
    }
 
    public event PropertyChangedEventHandler PropertyChanged;
 
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
        => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
 
}
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Мне кажется всё дело вот этом хитром объявлении привязки...
даже если сделать вот так {Binding VObject.ExistingCards появление ошибки сохраняется
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,765
Записей в блоге: 4
17.06.2025, 13:45
IIIIIIIIIgor, Элд Хасп, Просто никто из нас не сталкивался с наследованием INPC, не считая базового класса VM, но тут поведение без наследуемых свойств... И вот теперь обнаружился вот такой штука со свойствами базового класса...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
17.06.2025, 14:08
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
И вот теперь обнаружился вот такой штука со свойствами базового класса...
Не часто, но такое я использую.
А вот с такой ошибкой столкнулся первый раз.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,765
Записей в блоге: 4
17.06.2025, 15:26
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Не часто, но такое я использую.
Интересно, а как наследуемое свойство обрабатывается UI, если класс, в котором это свойство объявлено, не наследуется от INPC. А наследник этого класса наследует INPC, но свойство из родителя, который не INPC. То бишь родитель инициирует свой event из INPC (хотя сам не наследует его), а наследник (INPC) кидает его дальше в UI? Так это работает?

Если так, то оно конечно сильно заморочено... И про такой нюанс в описании интерфейса нету ничего... Но там есть вот такое замечание
Чтобы уведомление об изменениях произошло в привязке между привязанным клиентом и источником данных, связанный тип должен иметь одно из следующих значений:

Реализуйте INotifyPropertyChanged интерфейс (предпочтительный).

Укажите событие изменения для каждого свойства привязанного типа.

Не используйте оба механизма сразу.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
17.06.2025, 21:45
Лучший ответ Сообщение было отмечено IIIIIIIIIgor как решение

Решение

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Не используйте оба механизма сразу.
А вы поняли за какие два механизма извещения здесь пишут?

Добавлено через 28 минут
IIIIIIIIIgor, всё оказалось банальнее.
Для полного синтаксиса свойств в пути привязки надо явно задавать Path.
То есть, если на Шарпе, вот такие привязки не всегда одно и тоже:
C#
1
2
new Binding(stringPath);
new Binding(){Path = new PropertyPath(stringPath)};
Для пути в XAML VObject.(models:VObject1.ExistingCards) привязка будет такой:
C#
1
2
3
4
new Binding()
{
    Path = new PropertyPath("VObject.(0)", typeof(VObject1).GetProperty(nameof(VObject1.ExistingCards)))
};
Почему так....
Да, чёрт его знает.
Это особенность анализатора XAML. Не вижу каких-то проблем чтобы в XAML всегда анализатор вызывал дефолтную перегрузку Binding и передавал путь в свойство Path. Но сделано по иному. Какие аргументы у разработчику в пользу такой неоднозначности - не представляю.

Добавлено через 2 минуты
Собственно ответ на вопрос.
Надо во все привязки с полным синтаксисом добавить задание значения Path.
XML
1
2
3
4
<--! Вместо -->
Binding="{Binding VObject.(models:VObject1.ExistingCards),...
<--! надо -->
Binding="{Binding Path=VObject.(models:VObject1.ExistingCards),...
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.06.2025, 21:45

Ошибка: System.ArgumentNullException: "Значение не может быть неопределенным. Имя параметра: String"
Здравствуйте. В ноябре 20-го года делал программу-тест с простым графическим интерфейсом,...

Ошибка в конструкторе после переименования формы "Значение не может быть неопределенным. Имя параметра: format"
При переименовании формы в конструкторы вылезла ошибка &quot;Значение не может быть неопределенным. Имя...

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

Ошибка: Параметр типа значения ByRef не может быть неопределенным
Приветствую! VS2010, C#. Вызываю метод из чужого COM объекта: static void Main(string args)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru