Как установить свойство независимости от модели представления для динамического элемента управления - PullRequest
0 голосов
/ 07 декабря 2010

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

В моем представлении есть часть, представляющая собой набор вкладок, которые создаются на основе наблюдаемого списка в модели представления.Каждая вкладка имеет несколько встроенных элементов управления, одним из которых является 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>

1 Ответ

0 голосов
/ 07 декабря 2010

Пара вариантов:

  1. Прикрепленное поведение
  2. Используйте EventSetter в ItemContainerStyle для TabControl, чтобы выполнить некоторую логику, когда каждый TabItem загружается.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...