WPF datatemplate ItemsControl с указанием начальных и конечных значений - PullRequest
2 голосов
/ 30 сентября 2010

Я некоторое время использовал ItemsControl для тишины в WPF. Я использую MVVM для разработки моего приложения.

Теперь я столкнулся с проблемой. У меня есть требование, когда в зависимости от количества значений в IList <> я должен отображать количество текстовых полей, разделенных запятой между ними. Я написал ItemsControl, который перебирает связанный IList <> и отображает текстовые поля в зависимости от количества элементов.

Я написал шаблон данных, подобный этому

<DataTemplate x:Key="ParameterDisplay1">  
    <ItemsControl ItemsSource="{Binding Parameters}">  
        <ItemsControl.ItemsPanel>  
            <ItemsPanelTemplate>  
                <StackPanel Orientation="Horizontal"></StackPanel>  
            </ItemsPanelTemplate>  
        </ItemsControl.ItemsPanel>  
        <ItemsControl.ItemTemplate>  
            <DataTemplate>  
                <StackPanel Orientation="Horizontal" >  
                    <TextBox  Width="40" Height="auto" Margin="2" Text="{Binding ProcessData}"></TextBox>  
                    <TextBlock Text=" , " Width="auto" Height="auto" Margin="2" FontSize="15"></TextBlock>  
                </StackPanel>  
            </DataTemplate>  
        </ItemsControl.ItemTemplate>  
     </ItemsControl>  
</DataTemplate>  

И я использую это так:

<dg:DataGrid x:Name="DataGrid_Standard" toGenerateColumns="False">
    <dg:DataGrid.Columns>  
        <dg:DataGridTemplateColumn Header="Parameters" Width="SizeToCells" IsReadOnly="True"  
            CellTemplateSelector="{StaticResource paramTemplateSelector}">
        </dg:DataGridTemplateColumn> 
    </dg:DataGrid.Columns>  
</dg:DataGrid>  

Но проблема в том, что мне нужно отобразить "(" перед первым TextBox и ")" после последнего TextBox и "," между текстовыми полями.
Я должен отобразить что-то вроде этого ::::> ** (TextBox, TextBox, TextBox) **

Достичь этого с помощью codebehind очень просто, но я не хочу ничего писать в своем файле codebehind и хочу, чтобы мой View был чистым. Я хочу записать все только в файл XAML. Пример иллюстрации о том, как это сделать, будет очень полезен !!

1 Ответ

5 голосов
/ 30 сентября 2010

Оберните ItemsControl каким-либо элементом управления, который ставит круглые скобки с обеих сторон (возможно, панель док-станции).

Затем вставьте запятую в шаблон элемента, который отображается перед элементом.Используйте триггер данных с относительным источником типа «предыдущие данные» таким образом, чтобы, когда предыдущий элемент был нулевым, вы скрывали запятую (таким образом вы не видели запятую для первого элемента).

РЕДАКТИРОВАТЬ

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

<DataTemplate x:Key="ParameterDisplay1">
  <StackPanel Orientation="Horizontal">
    <TextBlock>(</TextBlock>
    <ItemsControl ItemsSource="{Binding Parameters}">
      <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
          <StackPanel Orientation="Horizontal"></StackPanel>
        </ItemsPanelTemplate>
      </ItemsControl.ItemsPanel>
      <ItemsControl.ItemTemplate>
        <DataTemplate>
          <StackPanel Orientation="Horizontal" >
            <TextBlock Text=", " Name="Comma"></TextBlock>
            <TextBox Width="40" Text="{Binding ProcessData}"></TextBox>
          </StackPanel>
          <!-- Make a trigger that hides the comma for the first item -->
          <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource PreviousData}}" Value="{x:Null}">
              <Setter TargetName="Comma" Property="Visibility" Value="Collapsed" />
            </DataTrigger>
          </DataTemplate.Triggers>
        </DataTemplate>
      </ItemsControl.ItemTemplate>
    </ItemsControl>
    <TextBlock>)</TextBlock>
  </StackPanel>
</DataTemplate>
...