Доступ codebehind переменная в XAML

Если у вас Bash 4.4 или новее, вы можете (ab) использовать расширение параметра ${parameter@P} , которое расширяет parameter так, как если бы это была строка приглашения: [ 116]

$ A='/home/userA'
$ B='$A/my_file'      # Single quotes to suppress expansion
$ echo "${B@P}"
/home/userA/my_file
$ A='/other/path'
$ echo "${B@P}"
/other/path/my_file

Однако, как указано в комментариях, гораздо проще и удобнее использовать функцию вместо:

$ appendfile() { printf '%s/%s\n' "$1" 'my_file'; }
$ A='/home/user'
$ B=$(appendfile "$A")
$ echo "$B"
/home/user/my_file
$ A='/other/path'
$ B=$(appendfile "$A")
$ echo "$B"
/other/path/my_file

48
задан Jared Forth 24 April 2018 в 03:56
поделиться

4 ответа

Существует несколько способов сделать это.

  • Добавляют Вашу переменную как ресурс от codebehind:

    myWindow.Resources.Add("myResourceKey", myVariable);
    

    Тогда можно получить доступ к нему от XAML:

    <TextBlock Text="{StaticResource myResourceKey}"/>
    

    , Если необходимо добавить его после того, как XAML анализируется, можно использовать DynamicResource выше вместо StaticResource.

  • Делают переменную свойством чего-то в Вашем XAML. Обычно это работает через DataContext:

    myWindow.DataContext = myVariable;
    

    или

    myWindow.MyProperty = myVariable;
    

    После этого что-либо в Вашем XAML может получить доступ к нему через Binding:

    <TextBlock Text="{Binding Path=PropertyOfMyVariable}"/>
    

    или

    <TextBlock Text="{Binding ElementName=myWindow, Path=MyProperty}"/>
    
64
ответ дан Robert Macnee 26 November 2019 в 18:43
поделиться

Для быстрого-и-грязного Windows в WPF я предпочитаю связывать DataContext Окна к самому окну; это может все быть сделано в XAML.

Window1.xaml

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    DataContext="{Binding RelativeSource={RelativeSource self}}"
    Title="Window1" Height="300" Width="300">
    <StackPanel>
        <TextBlock Text="{Binding Path=MyProperty1}" />
        <TextBlock Text="{Binding Path=MyProperty2}" />
        <Button Content="Set Property Values" Click="Button_Click" />
    </StackPanel>
</Window>

Window1.xaml.cs

public partial class Window1 : Window
{
    public static readonly DependencyProperty MyProperty2Property =
        DependencyProperty.Register("MyProperty2", typeof(string), typeof(Window1), new UIPropertyMetadata(string.Empty));

    public static readonly DependencyProperty MyProperty1Property =
        DependencyProperty.Register("MyProperty1", typeof(string), typeof(Window1), new UIPropertyMetadata(string.Empty));

    public Window1()
    {
        InitializeComponent();
    }

    public string MyProperty1
    {
        get { return (string)GetValue(MyProperty1Property); }
        set { SetValue(MyProperty1Property, value); }
    }

    public string MyProperty2
    {
        get { return (string)GetValue(MyProperty2Property); }
        set { SetValue(MyProperty2Property, value); }
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        // Set MyProperty1 and 2
        this.MyProperty1 = "Hello";
        this.MyProperty2 = "World";
    }
}

В вышеупомянутом примере, отметьте привязку, используемую в DataContext свойство на Окне, это говорит "Набор Ваш контекст данных себе". Эти два текстовых блока связываются с MyProperty1 и MyProperty2, обработчик событий для кнопки установит эти значения, которые автоматически распространят к Text свойство двух TextBlocks, поскольку свойства являются Свойствами Зависимости.

9
ответ дан Phil Price 26 November 2019 в 18:43
поделиться

Для привязки, если DataContext не используется, вы можете просто добавить это в конструктор стоящего за ним кода:

this.DataContext = this;

Используя это, каждое свойство в коде становится доступным для привязки:

<TextBlock Text="{Binding PropertyName}"/>

Другой способ - просто дать имя корневому элементу XAML:

x:Name="root"

Поскольку XAML скомпилирован как частичный класс кода программной части, мы можем получить доступ к каждому свойству по имени:

<TextBlock Text="{Binding ElementName="root" Path=PropertyName}"/>

Примечание: доступ доступен только для свойств; не в поля. set; и get; или {Binding Mode = OneWay} необходимы.

24
ответ дан 26 November 2019 в 18:43
поделиться

Также стоит отметить, что «Привязка» может быть установлена ​​только для DependencyProperty объекта DependencyObject. Если вы хотите установить не DependencyProperty (например, обычное свойство) для объекта в XAML, вам придется использовать первый метод Роберта использования ресурсов в коде позади.

3
ответ дан 26 November 2019 в 18:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: