2017-01-18 2 views
0

À titre d'exemple simple, j'ai un bouton dans un dictionnaire de ressources que je vais stocker dans un ContentControl. J'ai besoin d'un pour lier la propriété Visibilité du bouton à une case à cocher située sur la page, mais le bouton est créé avant la case à cocher, donc mon setter ne fonctionnera pas.Liaison tardive ou accès à un élément de page à partir de son dictionnaire de ressources

Existe-t-il un moyen de créer une liaison de liaison après l'initialisation de la page? Je sais que je peux le faire à partir du code derrière, mais j'aurai beaucoup de boutons, et il semble plutôt désordonné d'avoir des parties du code d'initialisation des boutons dans des endroits différents.

<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> 

J'ai trouvé des choses comme lazy loading, où vous chargez des objets lorsque vous en avez besoin, et je l'ai exploré making my own binding class, mais je ne sais pas où aller avec elle.

Mon idée actuelle préférée est quelque chose comme:

XAML:

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

et certains C# code classe générique:

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

Des idées?

+0

J'essayées votre code et il fonctionne très bien (autre que le fait que votre code ont compiler des questions qui devaient être fixés). Que se passe-t-il lorsque vous essayez de l'exécuter? –

Répondre

0

Votre code fonctionne avec peu de changements

<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> 
+0

Il s'avère que j'ai simplifié un peu mon problème, alors j'ai posé une autre question [ici] (http://stackoverflow.com/questions/41731592/binding-elementname-failing). Mais c'est certainement une excellente réponse à la question que j'ai posée. Cela m'a aidé à aller dans la bonne direction. Merci! – bwall