Databind от XAML до кода
У меня есть это свойство зависимости Text
в коде позади:
public static DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(MainWindow),
new PropertyMetadata("Hello world"));
public string Text {
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
Я хочу привязать содержимое метки к этому свойству Text
, чтобы метка отображала фактическое значение свойства Text
и наоборот.
<Label Content="{Binding ???}" />
Как я могу это сделать?
Я сделал это некоторое время назад, но теперь я не могу вспомнить, как это сделать, и это очень просто. Простейший код будет принят.
Ответы
Ответ 1
Установите DataContext вашего Window/Control в тот же класс, а затем укажите путь к привязке, например:
public class MyWindow : Window {
public MyWindow() {
InitializeComponents();
DataContext = this;
}
public string Text { ... }
}
Затем в вашем xaml:
<Label Content="{Binding Path=Text}">
Ответ 2
Вы должны установить DataContext окна для его работы. XAML:
<Window x:Class="WpfApplication2.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"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
<StackPanel>
<Label Content="{Binding Text}" />
<Button Content="Click me" Click="HandleClick" />
</StackPanel>
</Grid>
</Window>
Code-за:
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(MainWindow), new PropertyMetadata("Hello world"));
public string Text
{
get { return (string)GetValue(TextProperty); }
set { this.SetValue(TextProperty, value); }
}
public MainWindow()
{
InitializeComponent();
}
protected void HandleClick(object sender, RoutedEventArgs e)
{
this.Text = "Hello, World";
}
}
Ответ 3
Когда вы говорите это в коде, вы имеете в виду это в коде для окна вашего класса?
Возможно, вы захотите привязать к RelativeSource, где тип предка - это Window. В качестве альтернативы, если ваш контекст данных еще не установлен, в вашем событии "Загрузить" установите свойство DataContext окна самому окну (это) и просто используйте {Binding Text}.
Ответ 4
Настройка DataContext в XAML для Code-Behind может быть немного сложной, но в целом эта ситуация наиболее распространена:
- Вы хотите сделать DataContext все Окно или
Пользовательский UserControl
.
<Window
blahhhh..
DataContext={Binding RelativeSource={RelativeSource Mode=Self}}>
или
<UserControl
Blahhhh....
DataContext={Binding RelativeSource={RelativeSource Mode=Self}}>
2. если вы установите DataContext окна или пользовательского элемента управления на что-то другое, кроме кода, расположенного сзади, и у вас есть дочерний элемент управления, вам нужно будет установить его DataContext в Code-Behind you может использовать следующее:
<Label DataContext={Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}/>
для пользовательского UserControl:
<Label DataContext={Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UserControl}}/>
в этом случае настройка DataContext на себя, приведет к привязке к самому объекту метки, а не к коду управления. Надеюсь, что это поможет.