Ярлык WPF в StackPanel не изменяется при изменении содержимого при загрузке - PullRequest
0 голосов
/ 09 октября 2018

Пожалуйста, обратите внимание на данные Label, размер которых не изменяется при загрузке.Это работает впоследствии, когда вы выбираете различные элементы в ListView (но они должны иметь разную длину!).

Определение «изменения размера»: как правило, метка автоматически подстраивает свою ширину под размер содержимого.В моем подвиге этого не происходит.Контент обрезается.

Конечно, это должно быть s.е.что связано с тем, что я реализовал механизм автоматического выбора через выделенное свойство AutoSelect из Item.

Как я могу решить эту проблему, сохранив логику автоматического выбора?Пожалуйста, дайте возможность множественного выбора из уравнения, так как это не относится к этой проблеме.


Просмотр:

<Window x:Class="TestApp___WPF_ListView.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:TestApp___WPF_ListView"
        mc:Ignorable="d"
        Title="MainWindow" Height="300" Width="300">
    <Window.DataContext>
        <local:ViewModel />
    </Window.DataContext>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="50" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <StackPanel  Grid.Row="0" Grid.Column="0" Orientation="Horizontal" Margin="0 10">
            <Label Content="{Binding SelectedItemName}" BorderBrush="Red" BorderThickness="1" />
            <Label Content="Other Text" />
        </StackPanel>
        <ListView Grid.Row="1" Grid.Column="0" Name="listview" ItemsSource="{Binding TvItems}" SelectedItem="{Binding SelectedItem}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}" />
                </DataTemplate>
            </ListView.ItemTemplate>
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Setter Property="IsSelected" Value="{Binding AutoSelect}" />
                </Style>
            </ListView.ItemContainerStyle>
        </ListView>
    </Grid>
</Window>

ViewModel:

using System.Collections.ObjectModel;
using System.ComponentModel;

namespace TestApp___WPF_ListView
{
    public class ViewModel : INotifyPropertyChanged
    {
        private Item m_SelectedItem = null;

        public event PropertyChangedEventHandler PropertyChanged;
        protected void DoPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        public ObservableCollection<Item> Items { get; }

        public Item SelectedItem
        {
            get
            {
                return m_SelectedItem;
            }

            set
            {
                m_SelectedItem = value;
                DoPropertyChanged("SelectedItem");
                DoPropertyChanged("SelectedItemName");
            }
        }

        public string SelectedItemName { get { return m_SelectedItem?.Name ?? "null"; }
        }

        public ViewModel()
        {
            Items = new ObservableCollection<Item>();
            Items.Add(new Item("Item #1 asölkasd", false));
            Items.Add(new Item("Item #2 as", false));
            Items.Add(new Item("Item #3 asdköwowfialöafl", false));
            Items.Add(new Item("Item #4 akksad", true));
            Items.Add(new Item("Item #5 aöasölskfawelllkasdlk", false));
            Items.Add(new Item("Item #6 aslsdkföwl", false));
        }
    }
}

Элемент данных:

namespace TestApp___WPF_ListView
{
    public class Item
    {
        public string Name { get; set; }
        public bool AutoSelect { get; set; }

        public Item(string p_Name, bool p_AutoSelect)
        {
            Name = p_Name;
            AutoSelect = p_AutoSelect;
        }
    }
}

Конечно, мне понадобилось несколько часов, чтобы определить эту основную причинупроблема вне реального бизнес-приложения ...; -)

1 Ответ

0 голосов
/ 10 октября 2018

Если вы измените при загрузке модель представления из XAML в загруженный оператор, то проблема решится.Проблема в том, что модель представления создается перед представлением, поэтому никакие уведомления не сообщают обновлению представления.Как только вы нажимаете на элемент в списке, представление обновляется, получает событие уведомления, и все обновляется правильно.

Удалить:

<Window.DataContext>
        <local:ViewModel />
    </Window.DataContext>

Добавить:

 public MainWindow()
    {
        InitializeComponent();           
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        this.DataContext = new ViewModel();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...