views:

77

answers:

1

I have been using ItemsControl for quiet sometime in WPF. I am using MVVM for developing my application.

Now I have run into a problem. I have a requirement where in based on number of values in a IList<> , I have to display the number of TextBoxes separated by a comma in between. I have written an ItemsControl which iterates over the bound IList<> and displays the TextBoxes based on number of elements.

I have written a DataTemplate like this

<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>  

And I am using it like this :

<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>  

But the problem is, I have to display "(" before the first TextBox and a ")" after the last TextBox and "," in between the TextBoxes.
I have to display something like this ::::>    ** ( TextBox , TextBox , TextBox ) **

Achieving this using codebehind is easy, but I dont want to write anything in my codebehind file and I want my View to be clean. I want to write everything in XAML file only A sample illustration regarding how to do this will be of great help!!

+1  A: 

Wrap the ItemsControl with some sort of control that puts the parenthesis at either side (perhaps a dock panel).

Then, put a comma in the item template that displays before the item. Use a data trigger with relative source of type 'previous data' such that when the previous item is null, you hide the comma (that way you won't see the comma for the first item).

EDIT

Here's some code that shows what I mean. I don't have your data types or grid component, so it might not be quite right. It highlights the technique I mentioned, however.

<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>
Drew Noakes
Thanks Drew, but I am sorry to say I am not getting you. Where should I wrap the ItemsControl and where should I put the trigger. I have added more details to my question regarding how I am using it..
Guru Charan
@Guru, I've updated my answer with some code. Hope that's clearer.
Drew Noakes
@Drew -- Yipiie thanks a lot!!! Its working superb. I had spent so many hours on it... Once again thank you so much!!!!
Guru Charan
@guru, you're welcome :)
Drew Noakes