Есть ли способ связать результаты общедоступного метода в xaml.cs с элементом управления в xaml?

Возьмем очень простой пример:

  • В моем window1.xaml у меня есть элемент управления меткой с именем «lblProduct».
  • В моем window1.xaml.cs у меня есть общедоступный метод CalculateProduct (Int Var1, Int Var2). CalculateProduct, как вы могли догадаться, рассчитает произведение переданных переменных.

Я хотел бы просто привязать результаты «CalculateProduct» к моей метке. Мой реальный вариант использования немного сложнее, чем этот. Однако, если бы я мог запустить это и запустить, я не только был бы вполне счастлив, но и смог бы выяснить все остальное.

Я видел интересные примеры использования ObjectDataProvider для привязки к статическому методу нового класса. Хотя это хорошо, я не чувствую необходимости создавать новый класс, когда я уже создал экземпляр для своего окна. Кроме того, могут быть и другие глобальные переменные, которые я хотел бы использовать в своем классе Window1.

Спасибо за ваше время и помощь,

Абель.


person Abel    schedule 10.11.2008    source источник


Ответы (5)


Да, есть способ. Это некрасиво. Вы должны добавить атрибут xmlns:Commands в свой тег window1.xaml. В итоге я испортил код, который нашел в этой статье Code Project.

Является ли продукт, который вы хотите отобразить на этикетке, созданным при загрузке или в результате другого управляющего события?

Я не уверен, что это поможет вам, но я столкнулся с чем-то подобным, когда пытался динамически генерировать XAML с помощью XSLT. Мое решение сработало, вроде... ну, не совсем для того, что я пытался сделать. Но, возможно, это поможет вам.

Как я уже сказал, вы должны объявить xmlns в теге страницы, например:

<Page x:Class="WpfBrowserApplication1.Page1" 
  blah blah blah 
  xmlns:Commands="clr-namespace:WpfBrowserApplication1">

Затем определите статический класс в своем приложении с тем же пространством имен, почти таким же, как пример в статье Code Project, с обработчиками для RoutedUICommand:

namespace WpfBrowserApplication1
{
    public static class CommandHandlers
    {
        private static System.Windows.Input.RoutedUICommand _submitCommand;

        static CommandHandlers()
        {
            _submitCommand = new System.Windows.Input.RoutedUICommand("Submit", "SubmitCommand", typeof(CommandHandlers));
        }

        public static void BindCommandsToPage(System.Windows.Controls.Page caller)
        {
            caller.CommandBindings.Add(new System.Windows.Input.CommandBinding(SubmitCommand, SubmitContact_Executed, SubmitContact_CanExecute));
        }

        public static System.Windows.Input.RoutedUICommand SubmitCommand
        {
            get { return _submitCommand; }
        }

        public static void SubmitContact_Executed(object sender, System.Windows.Input.ExecutedRoutedEventArgs e)
        {
            ...do stuff...
        }

        public static void SubmitContact_CanExecute(object sender, System.Windows.Input.CanExecuteRoutedEventArgs e)
        {
            if (e.Source is System.Windows.Controls.Button)
                e.CanExecute = true;
            else
                e.CanExecute = false;
        }
    }
}

Неприятная часть заключается в том, что, насколько я обнаружил, единственный способ отобразить вещи обратно в Page1.xaml — это привести объект-отправитель и копаться в элементах пользовательского интерфейса страницы, подобно тому, как вы копались бы в DOM. на веб-странице. Я добился некоторого успеха в этом, но, конечно, не претендую на роль эксперта.

Последнее, что вам нужно сделать, это подключить элемент управления в Page1.xaml.cs. В XAML вы делаете это так:

<Button Name="btnSubmit" Command="Commands:CommandHandlers.SubmitCommand" etc... />

В коде, например так:

private void Page_Loaded(object sender, RoutedEventArgs e)
{
    CommandHandlers.BindCommandsToPage(this);
}

Я надеюсь, что это поможет, и удачи.

person AJ.    schedule 10.11.2008
comment
Это отличный план Б. Текущее состояние кода удовлетворительное. Я не думал о том, чтобы просто перенести все мои взаимодействия в статический вспомогательный класс, если это сделает привязку WPF удовлетворительной. Просто это кажется очень странным, но я могу справиться с этим, если это необходимо. - person Abel; 11.11.2008
comment
Я не могу дождаться, чтобы услышать больше о ублюдке ;-) - person Abel; 11.11.2008
comment
Я не уверен, что это то, что вы ищете, но я подумал, что это может помочь. - person AJ.; 11.11.2008
comment
Это будет хорошо! Я пытаюсь отпустить свои предвзятые представления о том, что я хочу делать, и я начинаю принимать то, что мне нужно делать. Спасибо приятель! - person Abel; 11.11.2008

Это быстро и грязно, но я бы, вероятно, просто установил свойство CalculateProduct с его результатом и привязкой данных к свойству.

person Bryan Anderson    schedule 10.11.2008
comment
Спасибо, я думал об этом как о решении, но я надеялся, что мне не хватает какого-то очень простого способа сделать это. Хотя отличная мысль. - person Abel; 11.11.2008

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

person aogan    schedule 11.11.2008

ObjectDataProvider имеет свойство ObjectInstance, которому вы можете назначить свой экземпляр Window.

person Kent Boogaart    schedule 10.11.2008
comment
Учитывая мой пример, что бы я установил для ObjectInstance? «Window1» и «это» не будут работать. - person Abel; 11.11.2008

aogan: Идея заключается в том, чтобы использовать гибкость привязки данных WPF. Я мог бы установить весь пользовательский интерфейс в коде позади, но MS разработала эту систему привязки, и я хотел легко воспользоваться ею. Кроме того, это был простой пример для более сложной задачи.

Для всех остальных участников я выбрал решение PITAdev. Спасибо за помощь.

person Abel    schedule 11.11.2008