我有窗口“ClientsWindow”,它的视图模型类“ClientsViewModel”。在ViewModel中,我定义了属性“Clients”并将其绑定到DataGrid的itemssource属性:
private ObservableCollection<tblClient> clients;
public ObservableCollection<tblClient> Clients
{
get { return clients; }
set
{
clients = value;
OnPropertyChanged("Clients");
}
}
在我的窗口构造函数中,我通过从wcf服务调用方法将此属性设置为新值:
Clients = new ObservableCollection<tblClient>(wcf.FilterClients(PageIndex, PageSize));
它工作得很完美,我从wcf服务获得10条记录应该是,并且列表显示在datagrid中。我插入了一些我想用于datagrid分页的usercontrol。它的ChangedIndexCommand定义如下:
ChangedIndexCommandProperty =
DependencyProperty.Register("ChangedIndexCommand", typeof(ICommand), typeof(GridPaging), new UIPropertyMetadata(null));
public ICommand ChangedIndexCommand
{
get { return (ICommand)GetValue(ChangedIndexCommandProperty); }
set { SetValue(ChangedIndexCommandProperty, value); }
}
我尝试将命令从我的窗口的viewmodel绑定到此命令,所以我这样做:
private ICommand _cmdChangedIndex;
public ICommand cmdChangedIndex
{
get
{
if (_cmdChangedIndex == null)
{
_cmdChangedIndex = new DelegateCommand(delegate()
{
worker.DoWork += worker_FilterClientsList;
worker.RunWorkerCompleted += worker_FilterClientListCompleted;
worker.RunWorkerAsync();
});
}
return _cmdChangedIndex;
}
}
private void worker_FilterClientsList(object sender, DoWorkEventArgs e)
{
try
{
ServiceClient wcf = new ServiceClient();
Clients = new ObservableCollection<tblClient>(wcf.FilterClients(PageIndex, PageSize));
TotalCount = wcf.ReturnClientsCount();
}
catch (Exception ex)
{
}
}
private void worker_FilterClientListCompleted(object sender, RunWorkerCompletedEventArgs e)
{
worker.DoWork -= worker_FilterClientsList;
}
这是xaml:
<pc:GridPaging PageIndex="{Binding PageIndex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
PageSize="{Binding PageSize, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
TotalCount="{Binding TotalCount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
HorizontalAlignment="Center" x:Name="clientsPagingControl"
ChangedIndexCommand="{Binding cmdChangedIndex, UpdateSourceTrigger=PropertyChanged}"
Visibility="Visible" VerticalAlignment="Top"
/>
所以,虽然调试一切都很完美!当我点击我的userconrol按钮时,我的命令被触发,wcf服务的方法被正确调用,它返回新的项目集合(计数2,按预期),我的“客户端”属性设置为新值BUT,UI仍在我的数据网格中显示10个项目。我只是想弄清楚出了什么问题?!这是将命令绑定到自定义用户控件的错误方法吗?另请注意,PageIndex,PageSize和TotalCount属性的类型为int,我将它们绑定到我的viewmodel属性,并且它们完美无缺。但是我的命令有什么问题?我试着尽可能地清楚,我希望你能理解我的问题是什么,如有更多信息,请留下评论。
OnPropertyChanged:
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
DataGrid绑定:
<DataGrid IsReadOnly="True" Name="dgClients" AutoGenerateColumns="False" ItemsSource="{Binding Path=Clients, UpdateSourceTrigger=PropertyChanged}">
<DataGrid.Columns>
....
</DataGrid.Columns>
</DataGrid>
答案 0 :(得分:0)
只是一个想法,但看起来你在ICommand中使用了BackgroundWorker类?在worker_FilterClientsList
方法中,您将设置“Clients”可观察集合属性。我认为您无法在DoWork中操作UI(它在不同的线程上运行)。尝试删除try..catch块以查看它是否隐藏了这样的错误。
您通常必须从RunWorkerCompleted委托(您的worker_FilterClientListCompleted
方法)更新UI。
答案 1 :(得分:0)
好的,所以根据你的问题,答案和许多评论来判断,你的问题似乎是无法重现的。这意味着你可以自己解决问题。但是,这听起来不像那样。
由于您显示的代码没有明显问题,我无法指出您的错误所在。但是,我可以让您走上正确的道路来解决自己的问题。 会花费一些时间和努力,但正如他们所说,“没有痛苦......没有收获”。
在复杂项目中找到问题的最佳方法之一是在新的空项目中简化它。通常在执行此操作时,会发生以下两种情况之一:要么您发现问题所在,要么创建一个简洁的工作示例来演示您的问题,然后您可以在此处发布(可能是一个新问题,或者 您当前的代码)。这通常是一个双赢的局面。
实际上,StackOverflow帮助中心有一个页面可以帮助解决这个问题。请按照How to create a Minimal, Complete, Tested and Readable example页面中的建议操作,以帮助您简化问题。
我想说的最后一点是,通常在应用程序中,数据访问层与UI是分开的。如果你将这些不同的问题分开,你也会发现它可以进一步简化这种情况。