Если у вас 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
Существует несколько способов сделать это.
Добавляют Вашу переменную как ресурс от 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}"/>
Для быстрого-и-грязного 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, поскольку свойства являются Свойствами Зависимости.
Для привязки, если 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}
необходимы.
Также стоит отметить, что «Привязка» может быть установлена только для DependencyProperty объекта DependencyObject. Если вы хотите установить не DependencyProperty (например, обычное свойство) для объекта в XAML, вам придется использовать первый метод Роберта использования ресурсов в коде позади.