0

ユーザーに 2 つのリストボックス (ウィンドウの両側に 1 つずつ) を表示し、それぞれに割り当てる画面スペースをユーザーが選択できるようにする必要があります。私は次のコードでそれを達成しました:

<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 プロパティが含まれています)。

4

1 に答える 1

0

私が考えることができる2つの解決策があります。

1.使用可能なさまざまなバインディングモード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.添付の動作パターンを使用してグリッドスプリッターの現在/デフォルトの動作をオーバーライドします(CodeProjectのチュートリアル)。明日、デスクにいるときに、このコードサンプルを投稿します。

于 2011-12-13T21:59:41.363 に答える