Передать сгенерированный список в VM

Рейтинг: 0Ответов: 0Опубликовано: 12.07.2023

Общая задача: к списку имен добавить префиксы(суффиксы) состоящие из текста и номера по порядку (сформировать новый список имен = префикс + имя + суффикс).

На скриншоте пример (для краткости только с префиксом)

введите сюда описание изображения

При вводе текста в Text и StartNumber (1 на скрине) формируется список префиксов - для наглядности вывел в ListBox(2 скрине). Нужно чтобы в (3) было префикс + имя. Код:

namespace WpfTestAddPrefix
{
    public class AppViewModel : INotifyPropertyChanged
    {
        private InputTextNumber _inputPrefix;
        public InputTextNumber InputPrefix
        {
            get => _inputPrefix;
            set { _inputPrefix = value; OnPropertyChanged();}
        }
        //список для ItemsControl для вводимых данных: InputPrefix, InputSuffix
        public List<InputTextNumber> Inputs { get; }

        //список для получения из InputPrefix.ResultList 
        private BindingList<string> _prefixes;
        public BindingList<string> Prefixes
        {
            get => _prefixes; 
            set { _prefixes = value; OnPropertyChanged();}
        }

        private BindingList<BaseClassViewModel> _bases;
        public BindingList<BaseClassViewModel> Bases
        {
            get => _bases;
            set { _bases = value; OnPropertyChanged(); }
        }
        public AppViewModel() 
        {
            _bases = new BindingList<BaseClassViewModel>
            {
                new BaseClassViewModel(new BaseClass{Name = "Project aaa"}),
                new BaseClassViewModel(new BaseClass{Name = "Project bbbb"}),
                new BaseClassViewModel(new BaseClass{Name = "Project ddd"}),
                new BaseClassViewModel(new BaseClass{Name = "Project rrrr"}),
                new BaseClassViewModel(new BaseClass{Name = "Project yyyy"})
            };
            _inputPrefix = new InputTextNumber("Prefix",Bases.Count);
            Inputs = new List<InputTextNumber> { _inputPrefix };
            InputPrefix.ResultList.ListChanged += InputPrefixListChanged;

        }
        private void InputPrefixListChanged(object sender, ListChangedEventArgs e)
        {
            if (e.ListChangedType == ListChangedType.ItemChanged)
            {
                Prefixes = InputPrefix.ResultList;
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName] string prop = "")
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
    }
    //класс для ввода текста и номера для генерации списка префикс
    public class InputTextNumber : INotifyPropertyChanged
    {
        string _textPrefix;
        public string TextPrefix
        {
            get => _textPrefix;
            set 
            {
                _textPrefix = value; 
                OnPropertyChanged(); 
                OnPropertyChanged(nameof(ResultList)); 
            }
        }
        string _numberStart;
        public string NumberStart
        {
            get => _numberStart;
            set 
            { 
                _numberStart = value; 
                OnPropertyChanged(); 
                OnPropertyChanged(nameof(ResultList)); 
            }
        }
        public BindingList<string> ResultList 
        {
            get
            {
                BindingList<string> listRezult = new BindingList<string>();
                if (String.IsNullOrEmpty(NumberStart))
                {
                    for (int i = 0; i < NumberAmount; i++)
                    {
                        listRezult.Add(TextPrefix);
                    }
                }
                else
                {
                    int startINT = Convert.ToInt32(NumberStart);

                    for (int i = startINT; i < startINT + NumberAmount; i++)
                    {
                    
                        listRezult.Add(TextPrefix + Convert.ToString(i));
                    }
                }
                return listRezult;
            } 
        }
        public string Name { get; }
        public int NumberAmount { get; }
        public InputTextNumber(string name, int numberAmount) 
        {
            this.Name = name;
            this.NumberAmount = numberAmount;
        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName] string prop = "")
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
    }


}

базовые классы:

public class BaseClassViewModel : INotifyPropertyChanged
{
    private BaseClass _baseClass;

    public BaseClassViewModel(BaseClass baseClass)
    {
        _baseClass = baseClass;
    }
    
    public string NameOld 
    {
        get { return _baseClass.Name; }
    }
    
    private string _nameNew;
    public string NameNew
    {
        get { return _nameNew; }
        set
        {
            _nameNew = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged([CallerMemberName] string prop = "")
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(prop));
    }
}
public class BaseClass
{
    private string _name;
    public string Name 
    {
        get { return _name; } 
        set { _name = value; } }
}

не понимаю как передать сгенерированный список в VM. Может вообще сам подход неверный? UPD: т.е. из InputPrefix.ResultList в Prefixes UPD2: добавил xaml

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="250"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <StackPanel Grid.Column="0" >
            <ItemsControl ItemsSource="{Binding Inputs}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition/>
                                <ColumnDefinition Width="65"/>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="20"/>
                                <RowDefinition Height="20"/>
                                <RowDefinition Height="20"/>
                                <RowDefinition Height="20"/>
                            </Grid.RowDefinitions>
                            
                            <TextBlock Grid.ColumnSpan="3"
                                    HorizontalAlignment="Center" FontWeight="Bold" FontSize="14"
                                    Text="{Binding Name}"/>
                            <TextBlock Grid.Column="0" Grid.Row="1" TextAlignment="Center" Margin="0,0,10,0"  >Text</TextBlock>
                            <TextBlock Grid.Column="1" Grid.Row="1" TextAlignment="Center"  >NumStart</TextBlock>

                            <TextBox Grid.Column="0" Grid.Row="2" TextAlignment="Right" 
                                    Text ="{Binding TextPrefix, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                            <TextBox Grid.Column="1" Grid.Row="2" TextAlignment="Center" Margin="2,0,2,0" 
                                    Text ="{Binding NumberStart, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
            <TextBlock>ResultList</TextBlock>
            <ListBox ItemsSource="{Binding InputPrefix.ResultList}"></ListBox>

        </StackPanel>
        <ListView Grid.Column="1" Grid.Row="0" 
                 ItemsSource="{Binding Bases}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock  
                            Text="{Binding NameNew, 
                            Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
        
    </Grid>

UPD3(для понимания того для чего нужен номер в префиксе и/или суффиксе): например из программы выгружены файлы в пдф, но имена файлов должны быть как в примере ниже: введите сюда описание изображения

Ответы

Ответов пока нет.