Hi,
to change and save xml you can use XElement:
ViewModel to previous XAML:
namespace WpfApp033
{
#pragma warning disable CS8601, CS8602, CS8612
class ProductPriceViewModel : INotifyPropertyChanged, ICommand
{
public List<string> MainProductCategory
{
get => new List<string>() {"PrintProduct","RetroPrint","PrintWithFrame","Calendar","Collage",
"CollagePoster","SingleSidePhoto","PassportPhoto","IDPhotoCard","GadgetProduct","GreetingCard"};
}
public List<string> ProductName
{
get => new List<string>() {
"10x10","10x15","10x8","10x20","13x18","13x13","15x20","15x23","20x25","20x30","Sticker","Metallic","Perfo" };
}
public event PropertyChangedEventHandler PropertyChanged;
public event EventHandler? CanExecuteChanged;
public void OnPropertyChanged(String info) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
private bool Filter(object item)
{
var ret = true;
if (!String.IsNullOrEmpty(MainProductSearch))
ret = ret && ((item as Product).Mainproduct.IndexOf(MainProductSearch, StringComparison.OrdinalIgnoreCase) >= 0) ||
((item as Product).Name.IndexOf(MainProductSearch, StringComparison.OrdinalIgnoreCase) >= 0);
if (!String.IsNullOrEmpty(SizeSearch))
ret = ret && ((item as Product).Name.IndexOf(SizeSearch, StringComparison.OrdinalIgnoreCase) >= 0);
return ret;
}
private ObservableCollection<Product> productpricelist;
public ObservableCollection<Product> ProductPriceList
{
get { return productpricelist; }
set
{
productpricelist = value;
OnPropertyChanged("ProductPriceList");
}
}
private CollectionViewSource cvs = new CollectionViewSource();
public ICollectionView View
{
get
{
if (cvs.Source == null)
{
cvs.Source = GetProductsPriceList();
cvs.View.Filter = Filter;
}
return this.cvs.View;
}
}
public Product SelectedProduct { get; set; }
private string _MainProductSearch;
public string MainProductSearch
{
get { return _MainProductSearch; }
set
{
_MainProductSearch = value;
OnPropertyChanged("MainProductSearch");
View.Refresh();
}
}
private string _SizeSearch;
public string SizeSearch
{
get { return _SizeSearch; }
set
{
_SizeSearch = value;
OnPropertyChanged("SizeSearch");
View.Refresh();
}
}
XElement data;
private List<Product> GetProductsPriceList()
{
var mylist = new List<Product>();
data = XElement.Load("Window033Dta.txt");
foreach (XElement xe1 in data.Elements())
if (xe1.Name == "Products")
foreach (var xe2 in xe1.Elements()) mylist.Add(new Product(xe2));
return mylist;
}
public bool CanExecute(object? parameter) => true;
public void Execute(object? parameter) => data.Save("xxx.txt");
}
}
public class Product
{
public Product(XElement xe3) => this.xe4 = xe3;
private XElement xe4;
public string Mainproduct { get => xe4.Name.LocalName; }
public string Name { get => xe4.Attribute("Name").Value; }
public string Price
{
get
{
XElement xe5 = xe4.Descendants("ProductPrice").FirstOrDefault();
if (xe5 == null) return string.Empty;
return xe5.Attribute("Price").Value;
}
set
{
XElement xe5 = xe4.Descendants("ProductPrice").FirstOrDefault();
if (xe5 != null) xe5.Attribute("Price").Value = value;
}
}
public string Visible
{
get
{
XElement xe5 = xe4.Descendants("ProductVisibility").FirstOrDefault();
if (xe5 == null) return string.Empty;
return xe5.Attribute("Visible").Value;
}
set
{
XElement xe5 = xe4.Descendants("ProductVisibility").FirstOrDefault();
if (xe5 != null) xe5.Attribute("Visible").Value = value;
}
}
}
}