延迟绑定,或从其资源字典访问页面元素

时间:2017-01-18 01:05:16

标签: c# wpf data-binding resourcedictionary late-binding

作为一个简单的例子,我在资源字典中有一个按钮,我将它存储在ContentControl中。我需要将Button的Visibility属性绑定到页面上的复选框,但是在复选框之前创建了按钮,因此我的setter将无法工作。





有没有办法在页面初始化后进行绑定绑定?我知道我可以从后面的代码中做到这一点,但是我将有很多按钮,并且将按钮的初始化代码的一部分放在不同的位置似乎相当混乱。




 < ResourceDictionary>&# xA;< button x:Key =“MyButton”> Hi There
< button.Style>
 <样式和GT;
 < Setter Property =“IsVisible”Value =“false”/>
 < DataTrigger // myCheckBox尚不存在......
 Binding =“{Binding ElementName = myCheckBox,Path = IsChecked}”“Value =”True“>
 < Setter Property =“IsVisible”Value =“true”/>
 < DataTrigger />
 < /样式和GT;
< /button.Style>
< /按钮>
< / ResourceDictionary中>

<网格和GT;
 < Grid.RowDefinitions>
 < RowDefinition Height =“1 *”/>
 < RowDefinition Height =“1 *”/>
 < RowDefinition Height =“1 *”/>
 < /Grid.RowDefinitions>

 < CheckBox x:Name =“myCheckBox”Row = 1 /> //将我的按钮绑定到

这已太晚了< ContentControl Content =“{StaticResource MyButton}”Row = 2 />

< / Grid>
  




我发现像延迟加载,在你需要的时候加载对象,我已经探索了制作我自己的绑定类,但我只是不知道该去哪里。





我目前的最爱想法是这样的:





xaml:




  property =“{lateBinding source = whatever path = you.want}“
  




和一些通用的c#类代码:




  class lateBinding:Binding
 {
 OnPageInitialized()
 {
 SetBinding(myObject,myProperty,myBinding);
 }
}
  




任何想法?




1 个答案:

答案 0 :(得分:0)

您的代码几乎没有变化

<Window x:Class="WpfApplication11.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">
    <Window.Resources>
        <ResourceDictionary>
            <Button  x:Key = "MyButton">Hi There
                <Button.Style>
                    <Style TargetType="{x:Type Button}">
                        <Style.Triggers>
                            <DataTrigger  Binding="{Binding ElementName=myCheckBox, Path=IsChecked}" Value="True">
                                <Setter Property="Visibility" Value="Visible"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding ElementName=myCheckBox, Path=IsChecked}" Value="False">
                                <Setter Property="Visibility" Value="Collapsed"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Button.Style>
            </Button>
        </ResourceDictionary>
    </Window.Resources>

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="1*"/>
        </Grid.RowDefinitions>

        <CheckBox x:Name = "myCheckBox" Grid.Row="1"/> 

        <ContentControl Content = "{StaticResource MyButton}" Grid.Row="2"/>

    </Grid>
</Window>