【问题标题】:Bind button click to set Icollection view source绑定按钮点击设置Icollection查看源码
【发布时间】:2023-01-13 23:17:47
【问题描述】:

当我的应用程序启动时,我使用视图模型方法读取了附加到源的定价文件方法,然后将其显示到数据网格。

当我单击一个按钮然后将该方法附加到查看源代码时,我正在尝试读取定价文件。

我试图在单击按钮时设置视图源,但数据网格中没有显示任何内容?谢谢你的帮助。

case "ReadPricing": //to read local pricing file
cvs.Source = GetProductsPriceListXML(); // method to read the xml file 
cvs.View.Filter = Filter;
View = cvs.View;
return;

按钮:

  <Button x:Name="breadxml"  HorizontalAlignment="Center" Margin="62,10" Width="76"  Command="{Binding MyCommand}" CommandParameter="ReadPricing" Height="43" >
                <TextBlock Text="Read Pricing File" TextWrapping="Wrap" TextAlignment="Center"/>
            </Button>

数据网格:

        <DataGrid VerticalAlignment="Top" HorizontalAlignment="Left" 
          SelectedItem="{Binding SelectedProduct}"
          ItemsSource="{Binding View}" AutoGenerateColumns="False" 
          CanUserAddRows="False" ScrollViewer.VerticalScrollBarVisibility="Visible" 
          Margin="0,2,0,0"   
          Height="{Binding RelativeSource={RelativeSource AncestorType={x:Type DockPanel}}, Path=ActualHeight}"  >
            <DataGrid.Columns>
                <DataGridTextColumn Header="MianProduct" Binding="{Binding Mainproduct}" Width="*" IsReadOnly="True"/>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}" Width="*" IsReadOnly="True"/>
                <DataGridTextColumn Header="Price" Binding="{Binding Price}" Width="*" />
                <!--<DataGridTextColumn Header="Visible" Binding="{Binding Visible}" Width="*" />-->
                <DataGridTemplateColumn Header="Visible"  Width="100" >
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox IsChecked="{Binding Visible, UpdateSourceTrigger=PropertyChanged}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTextColumn Header="NameIcon" Binding="{Binding NameIcon}" Width="*" />
            </DataGrid.Columns>
        </DataGrid>

数据上下文/转换器:

 <Window.DataContext>
        <local:ProductPriceViewModel/>
    </Window.DataContext>
    <Window.Resources>
        <local:MediaConverter x:Key="mconv" />
    </Window.Resources>

类视图模型:

class ProductPriceViewModel : INotifyPropertyChanged
    {
        
        public ProductPriceViewModel() { }

        public event PropertyChangedEventHandler PropertyChanged;
        public event EventHandler? CanExecuteChanged;

        public void OnPropertyChanged([CallerMemberName] String info = "") =>
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));

        private bool Filter(object item)
        {
            Product p = item as Product;
            if (p == null) return true;
            var ret = true;
            if (!String.IsNullOrEmpty(MainProductSearch))
                ret = ret && p.Mainproduct.IndexOf(MainProductSearch, StringComparison.OrdinalIgnoreCase) >= 0 ||
                p.Name.IndexOf(MainProductSearch, StringComparison.OrdinalIgnoreCase) >= 0;
    
            return ret;
        }

        private CollectionViewSource cvs = new CollectionViewSource();
        public ICollectionView View { get; set; } 


        public ICommand MyCommand { get => new RelayCommand(executemethod, canexecutemethod); }


        string pricinglocalfile = @"C:\xmltest\Prices.txt";
        private void executemethod(object parameter)
        {
            switch (parameter.ToString())
            {
                
                case "ReadPricing": //to read local pricing file
                    cvs.Source = GetProductsPriceListXML();
                    return;
                    
                case "SaveFile":
                    data.Save("xxx.txt");
                    return;
                
                default:
                    MediaType = parameter.ToString();
                    break;
            }
            View.Refresh();
        }

        private static bool canexecutemethod(object obj) => true;


        XElement data;

        private List<Product> GetProductsPriceListXML()
        {
            var mylist = new List<Product>();

            data = XElement.Load(pricinglocalfile);
            foreach (XElement xe1 in data.Elements())
                if (xe1.Name == "Products")
                    foreach (var xe2 in xe1.Elements()) mylist.Add(new Product(xe2));
            return mylist;
        }


    }

【问题讨论】:

  • ObervableCollection 不是更适合您的数据网格源吗?
  • @ChrisBD:不确定,但我已经不使用这种方法了。谢谢。任何想法通过单击按钮调用视图?谢谢

标签: c# xml data-binding viewmodel


【解决方案1】:

虽然我自己没有使用过它,但通读 Microsoft 文档后我相信 CollectionView 实际上是一个可以扩展的控件,它允许您在 UI 中操作数据集合而无需实际更改数据本身。它似乎也没有与 DataGrid 类型一起使用,而是替换了它们,具体来说,它扩展或替换了 ListView。

在这方面,您需要将您的 ItemSource 绑定到实际数据列表,例如 ObservableCollection&lt;Product&gt;,无论您在 UI 中使用 DataGrid 类型还是 CollectionView 类型。

因此,我建议您更改以下内容:

    private CollectionViewSource cvs = new CollectionViewSource();
    public ICollectionView View { get; set; } 

到

public ObservableCollection<Product> ProductList {get;set;}

这将在更新时自动触发NotifyCollectionChanged。

然后改变:

case "ReadPricing": //to read local pricing file
    cvs.Source = GetProductsPriceListXML();
    return;

到

case "ReadPricing": //to read local pricing file
    ProductList.Clear();
    var list = GetProductsPriceListXML();
    foreach(var p in list)
    {
        ProductList.Add(p);
    }
    return;

或者

case "ReadPricing": //to read local pricing file
    ProductList = new ObservableCollection<Product>(GetProductsPriceListXML());
    NotifyPropertyChanged("ProductList");
    return;

然后在您的视图中

    ItemsSource="{Binding View}" AutoGenerateColumns="False" 

成为

    ItemsSource="{Binding ProductList}" AutoGenerateColumns="False" 

我相信,如果您随后希望在运行时操作 ProductList 的布局或内容,您需要将 DataGrid 替换为 CollectionView,将它的 ItemSource 绑定到 ProductList,最后创建一个 @ 987654342@ 表示 CollectionView 类型属性并操纵数据的表示 - 可以找到示例 here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    相关资源
    最近更新 更多