【问题标题】:Data Binding in MVVM WPF - devexpressMVVM WPF 中的数据绑定 - devexpress
【发布时间】:2017-11-06 23:07:09
【问题描述】:

我正在寻找我的代码中的错误。 sql 查询返回 200 多个项目,但没有看到任何项目。 我有这个 FiltryView.xaml

<UserControl
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"             
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:Famex2.View"          
         xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
xmlns:dxdo="http://schemas.devexpress.com/winfx/2008/xaml/docking" xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
xmlns:dxlc="clr-namespace:DevExpress.XtraPrinting.Export;assembly=DevExpress.Printing.v16.2.Core"
xmlns:dxlc1="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol" x:Class="Famex2.View.FiltryView"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="3000">

<Grid>

        <Grid.RowDefinitions>
            <RowDefinition Height="300"/>
            <RowDefinition Height="19*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="310"/>
            <ColumnDefinition Width="300"/>
            <ColumnDefinition Width="300"/>
            <ColumnDefinition Width="1000*"/>
        </Grid.ColumnDefinitions>


    <local:GrupaKartotekFiltrView Grid.Column="0" Grid.Row="0" />
    <local:GrupaKartotekowaAsortymentView Grid.Column="1"  Grid.Row="0"/>
        <local:ZakresDatRozchodowView Grid.Column="2"  Grid.Row="0"/>
        <local:DodatkoweFiltryView Grid.Column="2" Grid.Row="0" VerticalAlignment="Bottom"/>
        <local:UczestniczyW1View Grid.Column="3" Grid.Row="0"/>

        <dx:SimpleButton Content="Oblicz" 
                     Grid.Column="3" 
                     HorizontalAlignment="Left" 
                     Height="29" 
                     Margin="10,261,0,0" 
                     VerticalAlignment="Top" 
                     Width="75" Click="SimpleButton_Click"/>

</Grid>

和他的班级

 public partial class FiltryView : UserControl
{
    public FiltryView()
    {
        InitializeComponent();
    }

    private void SimpleButton_Click(object sender, RoutedEventArgs e)
    {
        ParametryWyjscioweViewModel.Instance.startBackgroundProcess();
    }
}

第二个视图

<UserControl
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:Famex2.View"
         xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid" x:Class="Famex2.View.ParametryWyjscioweView"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <dxg:GridControl x:Name="ParametryWyjscioweGrid" 
        ItemsSource="{Binding ListaParametryWyjsciowe}" 
                     AutoGenerateColumns="AddNew">
        <dxg:GridControl.View>
            <dxg:TableView x:Name="view4"  AllowEditing="False"
                             AllowConditionalFormattingManager="True" AllowConditionalFormattingMenu="True"  />
        </dxg:GridControl.View>
    </dxg:GridControl>
</Grid>

他的视图模型:

 public class ParametryWyjscioweViewModel : INotifyPropertyChanged
{
    public List<ParametrWyjsciowy> ListaParametryWyjsciowe { get; set; }
    private static ParametryWyjscioweViewModel _instance = new ParametryWyjscioweViewModel();
    public static ParametryWyjscioweViewModel Instance { get { return _instance; } }

    BackgroundWorker _worker;
    public int _progress = 20;
    public int Progress
    {
        get { return _progress; }
        set
        {
            _progress = value;
            OnPropertyChanged(new PropertyChangedEventArgs("Progress"));
        }
    }
    public void startBackgroundProcess()
    {
        _worker = new BackgroundWorker();
        _worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        _worker.ProgressChanged += worker_Progress_Changed;
        _worker.RunWorkerAsync();
    }


    public ParametryWyjscioweViewModel()
    {
        ListaParametryWyjsciowe = new List<ParametrWyjsciowy>();

    }



    private void worker_Progress_Changed(object sender, ProgressChangedEventArgs e)
    {
        Progress = e.ProgressPercentage;
    }

    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        ListaParametryWyjsciowe.Clear();
        XmlReader xmlReader = new XmlReader(System.Environment.CurrentDirectory + @"\SqlConfig.xml");
        string sql = xmlReader.GetElementValue(0, "ParametryWyjsciowe");
        DataTable dt = DataBaseManager.ExecuteQueryResult(sql);

        foreach (DataRow dr in dt.Rows)
        {
            ParametrWyjsciowy parametr = new ParametrWyjsciowy();
            parametr.IdKartoteka = int.Parse(dr["id_kartoteka"].ToString());
            parametr.NazwaSkr = dr["nazwaskr"].ToString();
            parametr.NazwaDl = dr["nazwadl"].ToString();
            ListaParametryWyjsciowe.Add(parametr);
        }
    }


    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, e);
    }
}

也是他的课

public partial class ParametryWyjscioweView : UserControl
{
    public ParametryWyjscioweView()
    {
        InitializeComponent();

        DataContext = new ParametryWyjscioweViewModel();

    }

}

我有一个公共静态实例 (ParametryWyjscioweViewModel),我在视图类 (FiltryView) 中按钮的 onClick 函数中使用它。 当我在构造函数中得到一个 sql 查询时,它起作用了,但我希望它在单击按钮后发生。 有什么想法吗?

【问题讨论】:

    标签: c# wpf xaml mvvm devexpress


    【解决方案1】:

    DataContext 设置为从Instance 属性返回的实例。这是您使用数据填充的数据:

    public ParametryWyjscioweView()
    {
        InitializeComponent();
        DataContext = ParametryWyjscioweViewModel.Instance;
    }
    

    您还应该为List&lt;T&gt; 属性引发PropertyChanged 事件或使用ObservableCollection&lt;T&gt;

    public class ParametryWyjscioweViewModel : INotifyPropertyChanged
    {
        public List<ParametrWyjsciowy> ListaParametryWyjsciowe { get; set; }
        private static ParametryWyjscioweViewModel _instance = new ParametryWyjscioweViewModel();
        public static ParametryWyjscioweViewModel Instance { get { return _instance; } }
    
        BackgroundWorker _worker;
        public int _progress = 20;
        public int Progress
        {
            get { return _progress; }
            set
            {
                _progress = value;
                OnPropertyChanged(new PropertyChangedEventArgs("Progress"));
            }
        }
        public void startBackgroundProcess()
        {
            _worker = new BackgroundWorker();
            _worker.DoWork += new DoWorkEventHandler(worker_DoWork);
            _worker.ProgressChanged += worker_Progress_Changed;
            _worker.RunWorkerAsync();
        }
    
        private ParametryWyjscioweViewModel()
        {
            ListaParametryWyjsciowe = new List<ParametrWyjsciowy>();
        }
    
        private void worker_Progress_Changed(object sender, ProgressChangedEventArgs e)
        {
            Progress = e.ProgressPercentage;
        }
    
        private void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            XmlReader xmlReader = new XmlReader(System.Environment.CurrentDirectory + @"\SqlConfig.xml");
            string sql = xmlReader.GetElementValue(0, "ParametryWyjsciowe");
            DataTable dt = DataBaseManager.ExecuteQueryResult(sql);
    
            List<ParametrWyjsciowy> temp = new List<ParametrWyjsciowy>();
            foreach (DataRow dr in dt.Rows)
            {
                ParametrWyjsciowy parametr = new ParametrWyjsciowy();
                parametr.IdKartoteka = int.Parse(dr["id_kartoteka"].ToString());
                parametr.NazwaSkr = dr["nazwaskr"].ToString();
                parametr.NazwaDl = dr["nazwadl"].ToString();
            }
    
            Application.Current.Dispatcher.BeginInvoke(new Action(()=> 
            {
                ListaParametryWyjsciowe = temp;
                OnPropertyChanged("ListaParametryWyjsciowe");
            }));
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, e);
        }
    }
    

    【讨论】:

    • 糖化了我告诉他要做的事情 :o) 但是错过了丢失的 Datacontext。
    【解决方案2】:

    您在哪里 INotifyPropertyChanged 将您的内部列表添加到/由后台工作人员的新元素填充的绑定?

    也许使用 ObservableCollection 代替 List。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-20
      • 2015-05-24
      • 1970-01-01
      • 2011-02-01
      • 2014-08-09
      • 2019-06-23
      • 1970-01-01
      • 2020-09-27
      相关资源
      最近更新 更多