Передать сгенерированный список в VM
Общая задача: к списку имен добавить префиксы(суффиксы) состоящие из текста и номера по порядку (сформировать новый список имен = префикс + имя + суффикс).
На скриншоте пример (для краткости только с префиксом)
При вводе текста в 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(для понимания того для чего нужен номер в префиксе и/или суффиксе):
например из программы выгружены файлы в пдф, но имена файлов должны быть как в примере ниже:
Источник: Stack Overflow на русском