Передача строки из C # в кнопку XAML - PullRequest
1 голос
/ 18 октября 2011

Это очень простой вопрос: у меня есть строка, определенная в моем классе 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 #, а не наоборот, если это возможно.

Ответы [ 4 ]

3 голосов
/ 18 октября 2011

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

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

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

2 голосов
/ 18 октября 2011

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

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

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

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

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

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

Start.DataContext=this;

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

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

1 голос
/ 19 октября 2011

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

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 голос
/ 18 октября 2011

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

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