2011-12-13 5 views
0

Мне нужно отобразить пользователю два списка - по одному с каждой стороны окна - и позволить пользователю выбирать, какое пространство экрана будет посвящено каждому. Я добился того, что много с помощью следующего кода:Как получить ширину столбца в сетке WPF с помощью GridSplitter?

<Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="{Binding FirstColumnWidth}" /> 
     <ColumnDefinition Width="Auto" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <ListBox Name="FirstColumn" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="0" Grid.Column="0" /> 
    <GridSplitter Name="gridSplitter1" Width="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="0" Grid.Column="1" /> 
    <ListBox Name="SecondColumn" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="0" Grid.Column="2" /> 
</Grid> 

Однако, в то время как связывание будет получать исходную ширину первого столбца и размер их обоих, соответственно, используя GridSplitter, чтобы изменить их просто заменяет связывание с новым стоимость. Как я могу получить новое значение, чтобы сохранить его?

В идеале решение должно хорошо сочетаться с MVVM - я использую Caliburn и стараюсь, чтобы код был как можно более чистым (моя модель просмотра содержит свойство FirstColumnWidth, которое в настоящее время привязано).

+0

Ширина устанавливается только в начале. ActualWidth - свойство для фактической ширины. Возможно, вы можете привязать ActualWidth как свойство записи (режим). Но я помню пост, где была проблема с этим, хотя это имело смысл. – Paparazzi

+0

Вы должны посмотреть свойство ActualWidth. Проверьте это для получения дополнительной информации о том, как получить доступ к нему из модели просмотра: http://stackoverflow.com/questions/4438412/how-to-bind-a-read-only-wpf-control-property-eg-actualwidth-so -ITS-значение-это-ас –

ответ

0

Есть два решения, о которых я могу думать.

1. Используйте различные binding modes доступные и Width и ActualWidth свойства.

Пример

<Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="{Binding Path=FirstColumnWidth, Mode=OneTime}" /> 
     <ColumnDefinition Width="3" /> 
     <ColumnDefinition Width="{Binding Path=SecondColumnWidth, Mode=OneTime}" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <Grid Grid.Column="0" ActualWidth="{Binding Path=FirstColumnWidth, Mode=OneWayToSource}"> 
     <ListBox HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> 
    </Grid> 
    <GridSplitter Grid.Column="1" Width="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> 
    <Grid Grid.Column="2" ActualWidth="{Binding Path=SecondColumnWidth, Mode=OneWayToSource}"> 
     <ListBox HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> 
    </Grid> 
</Grid> 

или 2. Переопределение текущее поведение разветвителя сетки, используя прилагаемый шаблон поведения (tutorial on CodeProject)/по умолчанию. Я отправлю образец кода для этого завтра, когда я буду за своим столом.

Смежные вопросы