2011-07-20 10 views
0

私はXAMLを書いた:WPFバインドコントロール幅

<UserControl.Resources> 

    <GridViewColumnCollection x:Key="gvcc"> 
     <GridViewColumn Header="Klient" 
        DisplayMemberBinding="{Binding CustomerName}" 
        Width="80"> 
     </GridViewColumn> 
     <GridViewColumn Header="Budżet" 
        DisplayMemberBinding="{Binding Budget, StringFormat={}{0:C}}" 
        Width="80"> 
     </GridViewColumn> 
     <GridViewColumn Header="Zysk. zakł." 
        DisplayMemberBinding="{Binding ExpectedProfability, StringFormat={}{0:C}}" 
        Width="80"> 
     </GridViewColumn> 
     <GridViewColumn Header="Zysk. real." 
        DisplayMemberBinding="{Binding RealProfability, StringFormat={}{0:C}}" 
        Width="80"> 
     </GridViewColumn> 
     <GridViewColumn Header="Miejsce" 
        DisplayMemberBinding="{Binding Place}" 
        Width="80" /> 
     <GridViewColumn Header="Nr proj." 
        DisplayMemberBinding="{Binding Number}" 
        Width="80"> 
     </GridViewColumn> 

    </GridViewColumnCollection> 

</UserControl.Resources> 

... 

<Grid> 
     <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Visible"> 
      <ItemsControl ItemsSource="{Binding GroupedProjects}"> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <Grid> 
          <Grid.RowDefinitions> 
           <RowDefinition /> 
           <RowDefinition /> 
          </Grid.RowDefinitions> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="70" /> 
           <ColumnDefinition Width="*" /> 
          </Grid.ColumnDefinitions> 

          <Border Grid.Column="0" Grid.Row="0" Grid.RowSpan="3" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Background="Red" > 
           <TextBlock FontSize="13" Text="{Binding Month}" TextAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center" /> 
          </Border> 

          <GridViewHeaderRowPresenter Name="hrp" Columns="{StaticResource gvcc}" Grid.Column="1" Grid.Row="0" /> 
          <ListBox ItemsSource="{Binding Details}" Grid.Column="1" Grid.Row="1" ScrollViewer.VerticalScrollBarVisibility="Disabled" 
            GotFocus="ListBox_GotFocus" 
            PreviewMouseWheel="ListBox_PreviewMouseWheel" 
            SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.SelectedProject}"> 
           <ListBox.ItemTemplate> 
            <DataTemplate> 
             <GridViewRowPresenter Columns="{StaticResource gvcc}" Height="24" /> 
            </DataTemplate> 
           </ListBox.ItemTemplate> 
          </ListBox> 
<!-- HERE IS THE PROBLEM --> 
         </Grid> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <StackPanel Orientation="Vertical"/> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
      </ItemsControl> 
     </ScrollViewer> 
    </Grid> 

データは、私は、要約行のようなものを表示するリストボックスの下に、リストボックスにグループ化されています。私はTextBlockコントロールを持つStackPanelとしてこの行をやりたかったのです。問題は、 - TextBoxコントロールの幅とListBoxの列の幅を関連付ける方法です。

さんは「要約行は、」そのようなことであるとしましょう:あなたが見ることができるように

<StackPanel Orientation="Horizontal"> 
<TextBlock Width="bind to ListBox.Column1.Width + ListBox.Column2.Width">some data</TextBlock> 
<TextBlock Width="bind to ListBox.Column3.Width">other data</TextBlock> 
<TextBlock Width="bind to ListBox.Column4.Width">etc.</TextBlock> 
</StackPanel> 

- 最初のTextBlockの幅は、「= 2 ColumnSpan」のようなものです。他のTextBlockの幅は、単純にペアにしたい列の幅です。

このようなことはXAMLでも可能ですか?同様のソリューションをさまざまな方法で実装する方法を知っている人はいますか?

答えて

1

これをMVVMで実行している場合は、簡単にプロパティーバインドを使用して完了させることができます。各ListBox列の幅をViewModelのプロパティに設定するだけです。 textBoxコントロールの幅は、適切な幅をとり、何らかの方法でそれらを操作し、値を返す別々の読み取り専用プロパティにバインドされます。 INotifyPropertyChangedを実装し、listboxwidthプロパティが変更されるたびに、各textbox widthプロパティで呼び出す必要があります。

だから、のようなものはそう:

Private _Column1Width As Double 
Public Property Column1Width() As Double 
    Get 
     Return _Column1Width 
    End Get 
    Set(ByVal value As Double) 
     _Column1Width = value 
     OnPropertyChanged("TextBox1Width") 
    End Set 
End Property 

Private _Column2Width As Double 
Public Property Column2Width() As Double 
    Get 
     Return _Column2Width 
    End Get 
    Set(ByVal value As Double) 
     _Column2Width = value 
     OnPropertyChanged("TextBox1Width") 
    End Set 
End Property 

Public ReadOnly Property TextBox1Width() As Double 
    Get 
     Return Column1Width + (Column2Width * 2) 
    End Get 
End Property 

そしてそうのようなバインディング:

<GridViewColumnCollection x:Key="gvcc"> 
     <GridViewColumn Header="Klient" 
        DisplayMemberBinding="{Binding CustomerName}" 
        Width="{Binding Column1Width, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"}"> 
     </GridViewColumn> 
     <GridViewColumn Header="Budżet" 
        DisplayMemberBinding="{Binding Budget, StringFormat={}{0:C}}" 
        Width="{Binding Column2Width, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 
     </GridViewColumn> 
     <GridViewColumn Header="Zysk. zakł." 
        DisplayMemberBinding="{Binding ExpectedProfability, StringFormat={}{0:C}}" 
        Width="80"> 
     </GridViewColumn> 
     <GridViewColumn Header="Zysk. real." 
        DisplayMemberBinding="{Binding RealProfability, StringFormat={}{0:C}}" 
        Width="80"> 
     </GridViewColumn> 
     <GridViewColumn Header="Miejsce" 
        DisplayMemberBinding="{Binding Place}" 
        Width="80" /> 
     <GridViewColumn Header="Nr proj." 
        DisplayMemberBinding="{Binding Number}" 
        Width="80"> 
     </GridViewColumn> 
    </GridViewColumnCollection> 

<TextBlock Width="{Binding TextBox1Width}">some data</TextBlock> 

すべてが、それは継続的にあなたが列のサイズを変更として更新する必要があると同じようにサイズ変更します。