2008-11-18 3 views
1

J'ai un style pour un contrôle d'objets qui lie à une image dans la cible, il apparaît seulement si la cible aussi se lie à l'image et je ne sais pas pourquoi .. quelqu'un peut-il faire la lumière sur moi?Pourquoi ai-je un problème avec la liaison à une image à partir d'un modèle de contrôle?

Une version simplifiée de mon style:

<Style x:Key="testStyle" TargetType="ItemsControl"> 
    <Setter Property="Control.Template"> 
     <Setter.Value> 
      <ControlTemplate> 
       <DockPanel HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto" Height="Auto" LastChildFill="True"> 
         <Grid> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="32"/> 
           <RowDefinition Height="*"/> 
          </Grid.RowDefinitions> 
          <Grid Grid.Row="0" DockPanel.Dock="Top" MinHeight="25" SnapsToDevicePixels="True"> 
           <StackPanel Orientation="Horizontal"> 
            <Image Margin="10,0,10,0" VerticalAlignment="Stretch" Height="24" Width="24" Source="{Binding Path=HeaderImage}" /> 
            <TextBlock FontFamily="Tahoma" VerticalAlignment="Center" Text="{Binding Path=HeaderInfo}" /> 
           </StackPanel> 
           <Line VerticalAlignment="Bottom" Stretch="Fill"/> 
          </Grid> 
          <ItemsPresenter Grid.Row="1"/> 
         </Grid> 
        </DockPanel> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Mon contrôle de l'utilisateur:

<UserControl x:Class="StartPageView" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > 
<ItemsControl Style="{DynamicResource testStyle}"> 
    <Grid HorizontalAlignment="Stretch" > 
     <StackPanel> 
     <GroupBox Header="Information" Margin="0,0,0,10" > 
      <Label Margin="10,10,10,110">some useful information, dynamically updated</Label> 
     </GroupBox> 
     <GroupBox Header="Available actions" Margin="0,10,0,10"> 
      <StackPanel> 
       <Label Margin="10,10,10,10">action 1</Label> 
       <Label Margin="10,10,10,10">action 2</Label> 
       <Label Margin="10,10,10,10">action 3</Label> 
        <!--<Image Width="0" Height="0" Source="{Binding HeaderImage}"/>--> 
       </StackPanel> 
     </GroupBox> 
     </StackPanel> 
    </Grid> 
</ItemsControl> 

Et mon code modèle (défini comme le contexte de données pour mon contrôle utilisateur)

internal class StartPageViewPresentationModel : IStartPageViewPresentationModel 
{ 
    public StartPageViewPresentationModel(IStartPageView view) 
    { 
     HeaderImage = new BitmapImage(new Uri(@"Images/home_16.png", UriKind.Relative)) { CacheOption = BitmapCacheOption.Default }; 

     HeaderInfo = "Start Page"; 

     View = view; 
     View.Model = this; 
    } 

    public BitmapImage HeaderImage { get; set; } 

    public string HeaderInfo { get; set; } 

    public IStartPageView View { get; set; } 
} 

Si je ne commente pas la balise dans le contrôle utilisateur, alors l'image est affichée à la fois dans la zone de contrôle et dans la zone de gabarit. Si je la commente, elle n'apparaît pas non plus. Le texte obligatoire du modèle fonctionne très bien

Je suis perplexe ..

grâce

Trevor

Répondre

2

quelques suggestions:

  1. Avez-vous essayé une URI absolue pour l'image ?
  2. HeaderImage peut être de type ImageSource plutôt que le plus restrictif BitmapImage.

je soupçonne que ce qui se passe est le UserControl fonctionne parce que le chemin est relatif et approprié en fonction de l'emplacement du UserControl. L'image est donc mise en cache et fonctionne à partir du modèle.

Cependant, lorsque vous commentez que l'image est résolue à partir de l'emplacement du Style, ce n'est peut-être pas correct?

+0

Fantastique! Je vous remercie! HeaderImage = new BitmapImage (nouveau Uri ("pack: // application: ,,, /Monassembly.UI; component/Images/home_16.png")); ce qui est logique une fois que vous le signalez comme le style est dans un ensemble séparé .. Trev – Trev

Questions connexes