WPF UserControl命令绑定不是udpateing UI MVVM

时间:2014-02-18 14:09:30

标签: c# wpf mvvm user-controls

我有窗口“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>

2 个答案:

答案 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是分开的。如果你将这些不同的问题分开,你也会发现它可以进一步简化这种情况。