如何将参数传递给DataContext
本文关键字:DataContext 参数传递 | 更新日期: 2023-09-27 17:53:07
是否可以通过XAML将一些数据传递给绑定源/数据上下文?
在我的特殊情况下,我希望给绑定源一个对创建它的窗口的引用。
例如:<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MyNamespace"
x:Name="MyWindow">
<Window.Resources>
<local:MarginDataContext x:Key="MyDC"/>
</Window.Resources>
<!-- I want to pass in "MyWindow" to "MyDC" here... -->
<Grid Margin="{Binding Source={StaticResource MyDC}, Path=My_Margin}" />
</Window>
注意:MarginDataContext是我自己创建的,所以如果这涉及到添加构造函数参数或其他东西,那将工作得很好!
更新:我想要一个解决方案,坚持一些特定于我的项目的要求:
- 不使用x:Reference扩展名。
- 使用尽可能少的代码(我希望能够在XAML中完成大部分工作)。
谢谢!
你可以在XAML中访问你的MarginDataContext的任何属性。假设你创建了一个WindowInstance
属性,然后你可以通过使用x:Reference
:
<local:MarginDataContext x:Key="MyDC" WindowInstance="{x:Reference MyWindow}"/>
我有两种方法可以做到这一点,1)使用MarginDataContext构造函数的参数,2)在后面的代码中使用DataContextChanged。
方法1:Parameterized MarginDataContext有关更多信息,请参阅MSDN上的x:Arguments指令和x:Reference
public class MarginDataContext
{
public WindowInstance { get; set; }
...
}
<!-- xaml -->
<Window.Resources>
<local:MarginDataContext
x:Key="MyDC"
WindowInstance="{x:Reference MyWindow}" />
<!-- or possibly (not sure about this) -->
<local:MarginDataContext
x:Key="MyDC"
WindowInstance="{Binding ElementName=MyWindow}" />
<!-- or even (again, not sure about this) -->
<local:MarginDataContext
x:Key="MyDC"
WindowInstance="{Binding RelativeSource={RelativeSource Self}}" />
</Window.Resources>
方法2:使用后台代码。查看DataContextChanged获取更多信息。
public class MyWindow : Window
{
...
public MyWindow()
{
// Attach event handler
this.DataContextChanged += HandleDataContextChanged;
// You may have to directly call the Handler as sometimes
// DataContextChanged isn't raised on new windows, but only
// when the DataContext actually changes.
}
void HandleDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
var dc = DataContext as MarginDataContext;
if (dc != null)
{
// Assuming there is a 'MyWindow' property on MarginDataContext
dc.MyWindow = this;
}
}
}