Передача строки из C # на кнопку XAML

#c# #wpf #binding #button

#c# #wpf #привязка #кнопка

Вопрос:

Это очень простой вопрос: у меня есть строка, определенная в моем классе C #, и я хотел бы, чтобы она была содержимым кнопки XAML. Вот и все. Что я могу добавить в ????. Я знаю, что это базовый WPF … я буду продолжать искать ответ. Заранее спасибо.

Мой XAML

 <Window x:Class="BarScore.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        >

    <StackPanel>
        <Button Name="Start" Content="???" Height="25" Width="100"
           Margin="20" />
    </StackPanel>
</Window>
  

Мой код на C #

 using System;
using System.Windows;
using System.Windows.Controls;

namespace BarScore
{
    public partial class MainWindow : Window
    {
        public string BUTTON_NAME_STR = "START";

        public MainWindow()
        {
            InitializeComponent();
        }
    }
}
  

PS: Я знаю, что могу перейти к коду и написать:

 Start.Content = BUTTON_NAME_STR;
  

но я бы хотел, чтобы это было из XAML в C #, а не наоборот, если это возможно.

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

1. Вы указали привязку в качестве одного из своих тегов. Разве вы не получили какой-либо простейший пример в Интернете о том, как устанавливается контекст данных и как работает привязка?

2. @AngelWPF Я нашел несколько примеров, но большинство из них были привязаны к ресурсам (статическим и динамическим), другие были привязаны к внешнему xml. Я включил привязку, так как подумал, что это может быть синтаксис «привязки».

Ответ №1:

Я подозреваю, что вы хотите что-то вроде:

 <Button Name="Start" Content="{Binding BtnName}" />
  

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

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

1. Я пробовал ваше решение, но оно не работает. Никаких ошибок не отображается, кроме значения содержимого кнопки, только пустая кнопка. Можете ли вы объяснить, что вы имеете в виду, говоря «установить контекст данных для содержащей формы / страницы / чего угодно»? Кстати, я использую окно. Спасибо за попытку.

2. @Pimenta: я имею в виду установку DataContext свойства window для объекта, содержащего данные (которые могут быть «this»). В качестве альтернативы вы можете указать другой корень привязки в самой привязке.

3. Спасибо за обновление, это была недостающая ссылка. @Redburn отобразил полный ответ.

Ответ №2:

Ответы @Jon Skeet и @Steve Greatrex верны, но я хотел бы объяснить их @Pimenta.

Привязка данных в WPF выполняется относительно источника. Вы можете

  1. явно установите этот источник в выражении привязки, как это было в ответе @Steve’s (в его случае это был относительный источник);

  2. или это может быть неявным, как в решении @Jon, и в этом случае источником по умолчанию является DataContext элемент управления, который может быть установлен вручную или унаследован от его родителя.

Итак, чтобы решение @Steve работало, то, что вы называете своим «кодом C #», должно быть кодом для вашего xaml, который он принимает за window (элемент по умолчанию в WPF).

Чтобы решение @Jon работало, вам необходимо установить DataContext для вашей кнопки. Либо напрямую, написав:

 Start.DataContext=this;
  

или путем установки его (в коде) для элемента управления где-нибудь в иерархии xaml.

Надеюсь, это поможет 🙂

Ответ №3:

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

 using System;
using System.Windows;
using System.Windows.Controls;

namespace BarScore
{
    public partial class MainWindow : Window
    {
        private string _BUTTON_NAME_STR = "START";
        public string BUTTON_NAME_STR
        {
           get
           {
                return _BUTTON_NAME_STR;
           }
           set
           {
                _BUTTON_NAME_STR = value;
           }
        }

        public MainWindow()
        {
            InitializeComponent();
            Start.DataContext=this;
        }
    }
}
  

Затем установите привязку к своему свойству

 <StackPanel>
    <Button Name="Start" Content="{Binding BUTTON_NAME_STR}"
       Height="25" Width="100"
       Margin="20" />
</StackPanel>
  

Еще несколько ссылок на нее :

http://blogs.msdn.com/b/wpfsdk/archive/2006/10/19/wpf-basic-data-binding-faq.aspx

http://msdn.microsoft.com/en-us/magazine/cc163299.aspx

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

1. это именно то, что я искал. Спасибо за усилия и всем вам, кто помог. Я не смог объединить различные предложения.

Ответ №4:

Предполагая, что ваше BtnName свойство находится на родительском Window сервере, вы можете использовать следующее:

 <Button Name="Start" Content="{Binding BtnName,
    RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" />