Nano Hash - криптовалюты, майнинг, программирование

Привязка заголовка ContextMenu

Проведя весь день в поисках ответа, я вынужден признать поражение и попросить о помощи.

Все, что мне нужно сделать, это привязать элемент заголовка в контекстном меню к свойству, но все, что я пробовал, не удалось.

В коде позади меня есть простое свойство, которое возвращает строку в зависимости от флага

Показано ниже

namespace myNamespace
{

    public partial class MainWindow : System.Windows.Window
    {

        // Removed Init code for Clarity ......

        public OptMenuText optMenuText = new OptMenuText();

        public class OptMenuText
        {
            public  bool   menuState { get; set; }
            public  string menuHeader
            {
                get { if (menuState)
                         return "String One";
                      else
                         return "String Two";
                     } 
             }
     }

Код XAMl имеет ListView, связанный с ObservableCollection, содержащим данные и различные DataTemplates для отображения, которые работают нормально. Я читал, что контекстное меню не является частью основного контекста данных приложения и поэтому требует, чтобы DataContext был указан в теге (надеюсь, у меня есть это право)

В ListView есть контекстное меню, как показано ниже.

<ListView Name="listView1" Margin="6"  SelectionMode="Single"                        
    ItemsSource="{Binding ElementName=This, Path=ConnectCollection}" 
    ItemTemplateSelector="{StaticResource templateSelector}" IsTextSearchEnabled="False" >

    <ListView.ContextMenu>
        <ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"  >
            <MenuItem Header="{Binding menuHeader}" />
            <Separator />
            <MenuItem Header="Move Item Up"    Click="MenuItemUp_Click" />
            <MenuItem Header="Move Item Down"  Click="MenuItemDown_Click"/>
         </ContextMenu>
    </ListView.ContextMenu>

 </ListView>

Моя единственная проблема заключается в том, что я не могу привязать заголовок MenuItem к строковому свойству.

Сообщается об ошибке

Ошибка System.Windows.Data: 40: ошибка пути BindingExpression: свойство «menuHeader» не найдено в «объекте» «MainWindow» (Name = «This»)». BindingExpression:Path=menuHeader; DataItem='MainWindow' (Name='This'); целевой элемент — 'MenuItem' (Name=''); целевое свойство — «Заголовок» (тип «Объект»)

Может кто-нибудь, ПОЖАЛУЙСТА, показать мне, где я ошибаюсь.

Сара

24.05.2013

  • Ваш ContextMenu XAML в порядке. Это намекает на то, что DataContext для ListView не установлен. Попробуйте установить какое-нибудь свойство ListView (например, BorderThickness) через Binding и посмотрите, подействует ли оно. Если нет, то наверняка DataContext ListView установлен неправильно. 24.05.2013

Ответы:


1

Я не видел вашего вложенного класса в вопросе. Проблема в том, что у вас есть свойства во вложенном классе, и поэтому привязка не выполняется. Вам придется предоставить optMenuText как свойство, а не общедоступную переменную. Код ниже будет работать.

 public partial class MainWindow : System.Windows.Window {
     public MainWindow() {
        optMenuText = new OptMenuText();
        InitializeComponent();
     }
     public OptMenuText optMenuText { get; set; }
 }

а затем использовать

<MenuItem Header="{Binding optMenuText.menuHeader}" />

для вашей привязки

24.05.2013
  • Большое спасибо, это сработало, но я уверен, что понимаю, почему. Я думаю, что создал экземпляр класса OptMenuText, который содержит свойства, которые я использую, но также создал свойство для этого свойства, которое так запутано. Пожалуйста, не могли бы вы объяснить, как это работает? 24.05.2013
  • Это просто доступ к свойству класса. Даже если вы вынесете свой вложенный класс в отдельный файл, он будет работать. В вашем MainWindow есть объект optMenuText типа OptMenuText, который мы предоставляем как общедоступное свойство, чтобы мы могли связать его в XAML. 24.05.2013
  • Большое спасибо за вашу помощь и объяснение, очень признателен. 24.05.2013
  • Новые материалы

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

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..