Страницы

Поиск по вопросам

понедельник, 24 июня 2019 г.

Binding к this[enum] свойству экземпляра класса

Есть enum
namespace namespace1.namespace2{ enum PropertyObject { A=1, B=2, ... } }
и класс совершенно в другом namespace
public class MyClass { public Object this[namespace1.namespace2.PropertyObject property] { get { return ...; } } }
Список экземпляров всунут в ItemsSource ListView, есть также DataTemplate забитый как ItemTemplate у ListView

я уверен, что данный PropertyObject у экземпяров установлен, однако пишет, что не может достучаться до этого свойства, как создать валидный Binding к этим свойствам?
ошибка: System.Windows.Data Error: 40 : BindingExpression path error: '[]' property not found on 'object' ''MyClass' (HashCode=55693485)'. BindingExpression:Path=this[namespace1.namespace2.PropertyObject.A]; DataItem='MyClass' (HashCode=55693485); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')


Ответ

Вы используете неверный синтаксис для получения значения перечисления. В рамках XAML пространства имён в сборках (namespace в C#) и пространства имён в XML (xmlns в XML) задаются в шапке файла. При этом даже указание точного типа может не понадобиться: XAML достаточно умный, чтобы приобразовать строку к перечислению самостоятельно.
Понятия "this" в биндингах тоже нет. Скорее всего, вам нужен или текущий контекст (Path='.' или просто Path=''), или текущий элемент (RelativeSource='{RelativeSource Self}' и прочие).
Положим, у нас есть следующий код:
namespace HakunaMatata { public partial class MainWindow { public MainWindow () { InitializeComponent(); DataContext = new Model(); } }
public class Model { public string this [Other.Property prop] => prop.ToString() + " from Indexer"; } }
namespace Other { public enum Property { Foo, Bar, } }
Тогда все из способов обращения к индексатору будут работать корректно:

Комментариев нет:

Отправить комментарий