【发布时间】:2017-01-18 01:05:15
【问题描述】:
作为一个简单的例子,我在资源字典中有一个按钮,我将把它存储在 ContentControl 中。我需要将 Button 的 Visibility 属性绑定到位于页面上的复选框,但该按钮是在 复选框之前创建的,因此我的设置器将不起作用。
有没有办法在页面初始化后进行绑定绑定?我知道我可以从后面的代码中做到这一点,但是我会有很多按钮,而且看起来相当将按钮的部分初始化代码放在不同的位置很麻烦。
<ResourceDictionary>
<button x:Key = "MyButton">Hi There
<button.Style>
<Style>
<Setter Property="IsVisible" Value="false"/>
<DataTrigger // myCheckBox doesn't exist yet...
Binding="{Binding ElementName=myCheckBox, Path=IsChecked}" Value="True">
<Setter Property="IsVisible" Value="true"/>
<DataTrigger/>
</Style>
</button.Style>
</button>
</ResourceDictionary>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<CheckBox x:Name = "myCheckBox" Row=1/> //This is made too late to bind my button to
<ContentControl Content = "{StaticResource MyButton}" Row=2/>
</Grid>
我发现了类似lazy loading 的东西,你可以在需要时加载对象,我也探索过making my own binding class,但我只是不知道该去哪里。
我目前最喜欢的想法是这样的:
xaml:
property="{lateBinding source=whatever path=you.want}"
还有一些通用的 c# 类代码:
class lateBinding : Binding
{
OnPageInitialized()
{
SetBinding(myObject, myProperty, myBinding);
}
}
有什么想法吗?
【问题讨论】:
-
我试过你的代码,它工作正常(除了你的代码有编译问题必须修复)。当你尝试运行它时会发生什么?
标签: c# wpf data-binding resourcedictionary late-binding