将 DataContext 设置为 XAML 中的当前代码隐藏对象 [英] Setting the DataContext to the current code-behind object in XAML
问题描述
我正在尝试将我的 UserControl 的 DataContext 设置为 UserControl 的代码隐藏类.从代码隐藏方面做这件事真的很容易:
I'm trying to set the DataContext for my UserControl to the code-behind class of the UserControl. It's really easy to do from the code-behind side:
public partial class OHMDataPage : UserControl
{
public StringList Stuff { get; set; }
public OHMDataPage ()
{
InitializeComponent();
DataContext = this;
}
}
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Class="LCDHardwareMonitor.Pages.OHMDataPage">
<ScrollViewer>
<ListBox ItemsSource="{Binding Stuff}" />
</ScrollViewer>
</UserControl>
但是我怎样才能完全从 XAML 端和 UserControl 级别做到这一点?如果我这样做(并从代码隐藏中删除 DataContext = this;
),它可以在子节点上工作:
But how can I do this purely from the XAML side and at the UserControl level? It works on child nodes if I do this (and remove DataContext = this;
from the code-behind):
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Class="LCDHardwareMonitor.Pages.OHMDataPage">
<ScrollViewer
DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}">
<ListBox ItemsSource="{Binding Stuff}" />
</ScrollViewer>
</UserControl>
我真的很想了解如何在 UserControl 本身上执行此操作.我希望这能奏效:
I'd really like to understand how to do this on the UserControl itself. I expected this to work:
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Class="LCDHardwareMonitor.Pages.OHMDataPage"
DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}">
<ScrollViewer>
<ListBox ItemsSource="{Binding Stuff}" />
</ScrollViewer>
</UserControl>
但它没有.
推荐答案
DataContext="{Binding Mode=OneWay, RelativeSource={RelativeSource Self}}"
应该可以.
但如果在调用 InitializeComponent()
之前未设置属性,WPF 绑定机制不会知道您的属性值已更改.
But if your properties are not set before InitializeComponent()
is called, the WPF binding mechanism doesn't know that your property's values are changed.
给你一个快速的想法:
// the binding should work
public StringList Stuff { get; set; }
public Constructor()
{
Stuff = new StringList { "blah", "blah", "foo", "bar" };
InitializeComponent();
}
// the binding won't work
public StringList Stuff { get; set; }
public Constructor()
{
InitializeComponent();
Stuff = new StringList { "blah", "blah", "foo", "bar" };
}
如果您使用的是字符串列表,请考虑改用 ObservableCollection
.这将在添加或删除项目时通知 WPF 绑定机制.
If you're using a list of strings, consider using an ObservableCollection
instead. This will notify the WPF binding mechanism when items are added or removed.
这篇关于将 DataContext 设置为 XAML 中的当前代码隐藏对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!