WPFでTextBoxを含むDataTemplateをListViewの幅いっぱいに表示したい 

# TR;DL
- HorizontalContentAlignment="Stretch"
- ScrollViewer.HorizontalScrollBarVisibility="Disabled"

このふたつの設定をする

# ListViewの幅いっぱいにDataTemplateの中身を表示したい

## ListViewだけもったWindowをテスト用に作成

```xaml
<Window x:Class="TextboxInListSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:TextboxInListSample"
        mc:Ignorable="d"
        Title="MainWindow" Height="200" Width="200"
        >
    <Grid x:Name="Grid">
        <ListView x:Name="List">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="1*"/>
                            <ColumnDefinition Width="5*"/>
                        </Grid.ColumnDefinitions>
                        <TextBlock Text="{Binding No}" Grid.Column="0"/>
                        <TextBox Text="{Binding Name}" Grid.Column="1"/>
                    </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Window>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305757/ad1d5c34-124a-aa5f-0625-84fd88cea1fa.png)
うーん。幅いっぱいにならない

## HorizontalContentAlignment="Stretch" をつけると幅いっぱいになるらしい

```
        <ListView x:Name="List" HorizontalContentAlignment="Stretch">
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305757/608c65be-24dc-488f-2a9c-7c4b05b1a6ba.png)

おお、いいじゃん
テキストボックスの入力テストしてみよう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305757/0e2cf7c1-9721-65ff-aa50-1d2e7785d835.png)

**ちょっとまて**
なんでテキストボックス伸びるん

## 最大幅は固定したい
試行錯誤

### ListViewにMaxWidth設定すればいいのでは？ → 効果なし

```
        <ListView x:Name="List" HorizontalContentAlignment="Stretch" MaxWidth="180">
```

### ListView内のGridにMaxWidth設定すればいいのでは？ → なんかずれた

```
                    <Grid MaxWidth="180">
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305757/f474e86c-2b77-4449-3b2a-b449ac6d5738.png)

ほんと不可解

### ListView内のGridのWidthにListViewのActualWidthをBindingすればいいのでは？ → なんか最初からはみでた

```
                    <Grid Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}, Path=ActualWidth}">
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305757/cd5b4893-95d4-7a15-14e6-7441a895bfbf.png)

## 解決
`ScrollViewer.HorizontalScrollBarVisibility="Disabled"` が効果があるという記事を見つける

[Stretching the items in a WPF ListView within a ViewBox \- Stack Overflow](https://stackoverflow.com/questions/3715781/stretching-the-items-in-a-wpf-listview-within-a-viewbox)

```
        <ListView x:Name="List" HorizontalContentAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305757/4f6b1a26-c47e-0385-ff9b-bb6cda8f31ac.png)

できた！！！

でもなんでこれでそうなるのかよくわからない…