Текст элемента списка усекается после изменения источника элемента - PullRequest
1 голос
/ 15 марта 2012

У меня есть WPF ListView и MVVM.ListView является частью простой родительско-дочерней структуры.Родитель также является элементом управления ListView.Когда я изменяю выбранный элемент в родительском элементе управления, ItemsSource для дочернего элемента управления обновляется.Если, например, в первом ItemsSource самый длинный текст элементов содержит 5 символов, после изменения ItemsSource текст каждого элемента будет виден до 5 символов (в новом ItemsSource).Как я могу переопределить эту проблему?

Пример кода:

    <ListView Grid.Row="0" Grid.Column="3" ItemsSource="{Binding Tasks}" Width="200" Height="250" VerticalAlignment="Bottom" SelectionMode="Extended">
        <ListView.View>
            <GridView>
                <GridView.ColumnHeaderContainerStyle>
                    <Style TargetType="{x:Type GridViewColumnHeader}">
                        <Setter Property="Visibility" Value="Collapsed"/>
                    </Style>
                </GridView.ColumnHeaderContainerStyle>
                <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/>
            </GridView>
        </ListView.View>
        <ListView.ItemContainerStyle>
            <Style TargetType="{x:Type ListViewItem}" BasedOn="{StaticResource {x:Type ListViewItem}}">
                <Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}"/>
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>

Я использую тему BureauBlue, но в любом случае, если я ее не использую, у меня та же проблема.

Часть кода в ViewModel:

    private void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "CurrentParentItem")
        {
            if (this.CurrentParentItem != null)
            {
                this.Tasks = GetTasks();//ObservableCollection
            }
            else
            {
                this.Tasks = null;
            }
        }
    }

1 Ответ

2 голосов
/ 15 марта 2012

GridView не пересчитывает ширину с новыми данными. Для сброса ширины вы можете использовать следующее

            foreach (GridViewColumn c in gv.Columns)
            {
                // Code below was found in GridViewColumnHeader.OnGripperDoubleClicked() event handler (using Reflector)
                // i.e. it is the same code that is executed when the gripper is double clicked
                // if (adjustAllColumns || App.StaticGabeLib.FieldDefsGrid[colNum].DispGrid)
                if (adjustAllColumns || fdGridSorted[colNum].AppliedDispGrid)
                {
                    if (double.IsNaN(c.Width))
                    {
                        c.Width = c.ActualWidth;
                    }
                    c.Width = double.NaN;
                }
            }
...