繁体   English   中英

WPF UserControl命令绑定不更新UI MVVM

[英]WPF UserControl command binding not udpateing UI MVVM

我有窗口“ 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中。 我插入一些要用于数据网格分页的用户控件。 它具有如下定义的ChangedIndexCommand:

ChangedIndexCommandProperty =
        DependencyProperty.Register("ChangedIndexCommand", typeof(ICommand), typeof(GridPaging), new UIPropertyMetadata(null));


public ICommand ChangedIndexCommand
{
    get { return (ICommand)GetValue(ChangedIndexCommandProperty); }
    set { SetValue(ChangedIndexCommandProperty, value); }
}

我试图将窗体的窗口模型中的命令绑定到此命令,所以我这样做是这样的:

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仍然在我的datagrid中显示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>

只是一个想法,但是看起来您正在ICommand中使用BackgroundWorker类? worker_FilterClientsList方法中,您正在设置“客户端”可观察的集合属性。 我认为您无法从DoWork(在另一个线程上运行)中操纵UI。 尝试删除try..catch块以查看是否隐藏了此类错误。

通常,您必须从RunWorkerCompleted委托(您的worker_FilterClientListCompleted方法)更新UI。

好的,因此从您的问题,答案和许多评论来看,您的问题似乎无法重现。 这意味着您可以自己解决问题。 但是,这并不像听起来那样糟糕。

由于您显示的代码没有明显问题,因此我无法指出您的错误所在。 但是,我可以将您带入正确的道路,以解决您自己的问题。 正如他们所说,这需要您花费一些时间精力,但是“没有痛苦,没有收获”。

在复杂项目中发现问题的最好方法之一是在一个新的空项目中简化它。 通常情况下这样做的时候,两件事情发生:要么你发现了什么问题,或者你创建一个演示你的问题,然后你就可以张贴在这里(也许是一个新的问题,或代替目前的简要工作示例码)。 这通常是双赢的情况。

碰巧的是,StackOverflow帮助中心有一个页面可以帮助您解决此问题。 请遵循如何创建最小,完整,经过测试和可读的示例页面中的建议,以帮助您简化问题。

我要说的最后一点是,通常在应用程序中,数据访问层与UI分离。 如果将这样的不同问题分开,您还会发现它进一步简化了情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM