2017-01-18 2 views
0

Как простой пример, у меня есть кнопка в словаре ресурсов, которую я буду хранить в ContentControl. Мне нужно привязать свойство Видимости Button к флажку, расположенному на странице, но кнопка создана до, поэтому мой сеттер не будет работать.Late Binding, или доступ к элементу страницы из его ресурсного словаря

Есть ли способ сделать привязку привязки после инициализации страницы? Я знаю, что могу сделать это из кода позади, но у меня будет много кнопок, и кажется довольно беспорядочным иметь части кода инициализации кнопок в разных местах.

<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); 
    } 
} 

Любые идеи?

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

Оказывается, я немного упростил свою проблему, поэтому я задал еще один вопрос [здесь] (http://stackoverflow.com/questions/41731592/binding-elementname-failing). Но это определенно отличный ответ на вопрос, который я задал. Это помогло мне идти в правильном направлении. Благодаря! – bwall

Смежные вопросы