2010-12-07 1 views
0

Je sais que ma ligne d'objet est un peu confuse, et ce soit parce que je me suis tellement embrouillé que je manque une solution simple ou que cette est vraiment l'un de ces noix difficiles.Comment définir une propriété de non-dépendance à partir du viewmodel pour un contrôle dynamique

Ma vue comporte une partie qui est un ensemble d'onglets créés en fonction d'une liste observable dans le modèle de vue. Chaque onglet comporte deux contrôles incorporés, dont un RichTextBox. L'une des grandes limitations d'un RichTextBox est que le document n'est pas une propriété de dépendance, et je sais qu'une solution consisterait à sous-classer le contrôle et à ajouter simplement une propriété de dépendance.

J'ai abordé ce problème à partir de quelques directions, et je ne suis pas en train de faire des progrès probablement en raison de ma connaissance toujours croissante de .net. Je crois que mon plus gros problème est la séparation de la vue et de la VM. Ma vue a la VM comme une source de données, et mon groupe original de 8 éléments est correctement généré. Toutefois, même si la classe utilisée dans la liste observable a un fluxdocument comme l'un de ses éléments, il n'existe aucun moyen XAML pour lier ce flowdocument à RichTextBox. Il ne semble pas être un événement de type newTabAdded pour TabControl et l'événement Initialized pour le RichTextBox ne semble même pas pour le code derrière dans la vue. Même si je pouvais capturer un événement utile dans le code, je n'arrive pas à comprendre comment fonctionne la commande Relay sur un contrôle qui n'implémente pas la source ICommand pour transmettre l'événement à ma VM. Donc ma question est, quel modèle ou classe est utilisé qui permettra l'accès dans la machine virtuelle à un contrôle spécifique dans la vue qui est créée dynamiquement sur la base d'une liste observable et peut changer dynamiquement pendant l'exécution? Je le fais sous VS2010 Professional pour .net4.0 et j'ai également accès au mixage. Mon exigence actuelle est de définir le document une seule fois, mais dans un monde parfait, je préférerais être en mesure de changer le document.

Voici le XAML actuel

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Luna" 
    xmlns:CustomControlLibrary="clr-namespace:CustomControlLibrary;assembly=CustomControlLibrary" 
    x:Class="ClientUI.View" 
    Title="ViewWindow" Height="350" Width="525"> 
<Window.Resources> 
    <DataTemplate x:Key="BSwitchTemplate"> 
     <StackPanel x:Name="Switch_Listing"> 
      <Button Content="{Binding SwitchInstance.boxName, Mode=OneWay}" Width="75" Style="{DynamicResource swmainbuttonTemplate}"> 
       <Button.Resources> 
        <Style x:Key="ButtonFocusVisual"> 
         <Setter Property="Control.Template"> 
          <Setter.Value> 
           <ControlTemplate> 
            <Rectangle Margin="3" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 
        <LinearGradientBrush x:Key="ButtonNormalBackgroundFill" EndPoint="0.5,1" StartPoint="0.5,0"> 
         <GradientStop Color="#FFFFFFFF" Offset="0"/> 
         <GradientStop Color="#FFF0F0EA" Offset="0.9"/> 
        </LinearGradientBrush> 
        <SolidColorBrush x:Key="ButtonBorder" Color="#FF003C74"/> 
        <Style x:Key="swmainbuttonTemplate" TargetType="{x:Type Button}"> 
         <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/> 
         <Setter Property="Background" Value="{StaticResource ButtonNormalBackgroundFill}"/> 
         <Setter Property="BorderBrush" Value="{StaticResource ButtonBorder}"/> 
         <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
         <Setter Property="HorizontalContentAlignment" Value="Center"/> 
         <Setter Property="VerticalContentAlignment" Value="Center"/> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate TargetType="{x:Type Button}"> 
            <Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" BorderBrush="{TemplateBinding BorderBrush}" Fill="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}" RenderDefaulted="{TemplateBinding IsDefaulted}" SnapsToDevicePixels="true" ThemeColor="NormalColor"> 
             <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
            </Microsoft_Windows_Themes:ButtonChrome> 
            <ControlTemplate.Triggers> 
             <Trigger Property="IsKeyboardFocused" Value="true"> 
              <Setter Property="RenderDefaulted" TargetName="Chrome" Value="true"/> 
             </Trigger> 
             <Trigger Property="ToggleButton.IsChecked" Value="true"> 
              <Setter Property="RenderPressed" TargetName="Chrome" Value="true"/> 
             </Trigger> 
             <Trigger Property="IsEnabled" Value="false"> 
              <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
             </Trigger> 
            </ControlTemplate.Triggers> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </Button.Resources> 
      </Button> 
     </StackPanel> 
    </DataTemplate> 
    <DataTemplate x:Key="Template_swTabHeader"> 
     <Grid Height="Auto" Width="Auto"> 
      <TextBlock TextWrapping="Wrap" Text="{Binding SwitchInstance.boxName, Mode=OneWay}" FontFamily="Times New Roman" FontSize="13.333" HorizontalAlignment="Center" Width="Auto" VerticalAlignment="Center"/> 
     </Grid> 
    </DataTemplate> 
    <DataTemplate x:Key="Template_swTabContent"> 
     <Grid> 
      <RichTextBox x:Name="richTextBox" Margin="0,0,8,23.84" FontFamily="Lucida Console" Initialized="AssignDocument"> 
      </RichTextBox> 
      <CustomControlLibrary:CLI_EntryBox HorizontalAlignment="Stretch" Height="20.5" Margin="2,0,8,0" TextWrapping="Wrap" Text="CLI_EntryBox" VerticalAlignment="Bottom"/> 
     </Grid> 
    </DataTemplate> 
</Window.Resources> 
<Grid DataContext="{Binding Source={StaticResource VMDataSource}}"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="0.552*"/> 
     <RowDefinition Height="0.448*"/> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="0.454*"/> 
     <ColumnDefinition Width="0.546*"/> 
    </Grid.ColumnDefinitions> 
    <ListBox x:Name="mainswitchlist" HorizontalAlignment="Left" Margin="8,8,0,34.5" Width="105" SelectionMode="Multiple" ItemTemplate="{DynamicResource BSwitchTemplate}" ItemsSource="{Binding fabric_switches}" FontFamily="Times New Roman" Grid.RowSpan="2" /> 
    <TabControl x:Name="swTabs" Margin="117,8,51,34.5" Grid.ColumnSpan="2" ItemsSource="{Binding fabric_switches}" ItemTemplate="{DynamicResource Template_swTabHeader}" ContentTemplate="{DynamicResource Template_swTabContent}" Grid.RowSpan="2" DataContext="{StaticResource VMDataSource}" SelectionChanged="swTabs_SelectionChanged" /> 
    <Button Content="Button" Grid.Column="1" Height="26" HorizontalAlignment="Left" Margin="242,18,0,0" Name="button1" VerticalAlignment="Top" Width="27" /> 
</Grid> 

Répondre

0

Couple d'options:

  1. Un comportement attaché
  2. Utilisez un EventSetter dans le ItemContainerStyle pour le TabControl pour effectuer une certaine logique lorsque chaque TabItem charges.
+0

Merci. Un rapide coup d'œil sur le Setter Event semble que cela pourrait correspondre à mon projet de loi. J'espère revenir à ce problème la semaine prochaine et essayer de comprendre exactement comment mettre en œuvre cela. – Blindrage