#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 выполняется относительно источника. Вы можете
-
явно установите этот источник в выражении привязки, как это было в ответе @Steve’s (в его случае это был относительный источник);
-
или это может быть неявным, как в решении @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
Комментарии:
1. это именно то, что я искал. Спасибо за усилия и всем вам, кто помог. Я не смог объединить различные предложения.
Ответ №4:
Предполагая, что ваше BtnName
свойство находится на родительском Window
сервере, вы можете использовать следующее:
<Button Name="Start" Content="{Binding BtnName,
RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" />