簡體   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