2008-11-10 3 views
2

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

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

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

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

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

Абель.

ответ

2

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

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

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

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

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

Затем определить статический класс в приложении с тем же пространством имен, почти так же, как в примере в статье Co 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 должен привести объект отправителя и выкапывать элементы пользовательского интерфейса страницы, подобно тому, как вы выкапываете h DOM на веб-странице. У меня был некоторый успех в этом, но, конечно, не претендуйте на роль эксперта.

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

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

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

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

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

+0

Это отличный план B. Текущее состояние кода достойное. Я не думал просто перемещать все свои взаимодействия в статический вспомогательный класс, если это делает WPF привязанным. Это просто очень странно, но я могу преодолеть это, если это необходимо. – Abel

+0

Я не могу дождаться, когда узнаю больше о сволочь ;-) – Abel

+0

Я не уверен, что это то, что вы ищете, но я подумал, что это может помочь. –

1

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

+0

Учитывая мой пример, что бы я установил ObjectInstance? «Window1» и «this» не будут работать. – Abel

3

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

+0

Спасибо, я подумал об этом как о решении, но я надеялся, что я пропустил какой-то простой способ сделать это. Однако большая мысль. – Abel

1

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

0

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

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