Я знаю, что моя сюжетная линия немного сбивает с толку, и это либо потому, что я запутался настолько, что упускаю простое решение, либо что это действительно один из тех крепких орешков.
В моем представлении есть часть, представляющая собой набор вкладок, которые создаются на основе наблюдаемого списка в модели представления.Каждая вкладка имеет несколько встроенных элементов управления, одним из которых является RichTextBox.Одним из больших ограничений RichTextBox является то, что Document не является свойством зависимости, и я знаю, что одним из решений было бы подразделить элемент управления и просто добавить свойство зависимости.
Я подошел к этой проблеме изпара указаний, и я просто не продвигаюсь вперед, вероятно, из-за моего все еще растущего знания .net.Я считаю, что моей самой большой проблемой является разделение зрения и виртуальной машины.В моем представлении виртуальная машина используется в качестве источника данных, а исходная группа из 8 элементов сформирована правильно.Однако, хотя класс, используемый в наблюдаемом списке, имеет потоковый документ в качестве одного из его элементов, нет способа XAML связать этот потоковый документ с RichTextBox.Кажется, что нет никакого события типа newTabAdded для TabControl, и событие Initialized для RichTextBox, кажется, даже не делает это к коду позади в Представлении.Даже если бы я мог зафиксировать полезное событие в коде позади, я не могу понять, как команда Relay работает с элементом управления, который не реализует источник ICommand для передачи события моей виртуальной машине.
Итак, мой вопрос в том, какой шаблон или класс используется, чтобы разрешить в ВМ доступ к определенному элементу управления в представлении, которое создается динамически на основе наблюдаемого списка и может динамически изменяться во время выполнения?Я делаю это под VS2010 Professional для .net4.0 и также имею доступ к blend.Мое текущее требование - установить документ только один раз, но в идеальном мире я бы предпочел изменить документ.
Вот текущий XAML
<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>