簡體   English   中英

使用父級的DataContext(WPF - 動態菜單命令綁定)

[英]Using the parent's DataContext (WPF - Dynamic Menu Command Binding)

我查看了這個網站和谷歌,解決方案對我不起作用。

我在UserControl的ViewModel上有一個命令。 好吧,usercontrol有一個綁定到ObservableCollection的ItemsControl。 在ItemsControl.ItemTemplate的DataTemplate中,我有一個按鈕,我想使用該命令。 我無法綁定命令,因為在DataTemplate中,datacontext不是ViewModel而是ObservableCollection的項。

問題是:如果丟失了父datacontext,如何將按鈕綁定到命令?

我認為這需要一個簡單的解決方案,因為我認為這是一個常見的問題。

想象一下這個場景:

您有一個帶有observableCollection的ListBox項作為ItemsSource,因此您在ListBox中為集合中的每個元素使用了一個datatemplate。 好吧,您想刪除所選項目,並在該行的每一行中放置一個按鈕。 你是怎樣做的?

在MVP中,我可以在按鈕的單擊事件中執行此操作:

Button but = e.Source as Button;

if (but != null)
      Presenter.ActualNote = but.DataContext as Note;

簡而言之。 您將行的datacontext(所選項目)發送到演示者。

但是,我怎么能用mvvm方式呢? 因為我需要使用命令但是我無法將命令分配給按鈕,因為該按鈕對ViewModel(命令所在的位置)一無所知。

正如您所看到的,按鈕必須存在於datatemplate中,然后datacontext不再是ViewModel ....這就是我需要訪問父級DataContext以訪問命令的原因。

我希望你能更好地理解我的問題。

謝謝。

使用下面的綁定作為按鈕的命令:

{Binding DataContext.CommandName, 
         RelativeSource={RelativeSource FindAncestor, 
                         AncestorType={x:Type MyUserControl}}}

這將告訴它找到你的UserControl並使用它的DataContext。

如果你想要一個破壞性的MVVM解決方案,那么在按鈕上設置Tag =“{Binding}”並處理Click事件。 在事件處理程序中,在ViewModel上調用該命令。

那么,那么修改數據項類以使其具有引用整個模型視圖的屬性呢?

如果您的ItemsSource的類型為ObservableCollection<DataItem>則修改DataItem類型,如下所示:

public class DataItem
{
    public BusinessObject Value { get; set; }

    private ModelView modelView;

    public ModelView ModelView
    {
        get
        {
            return modelView;
        }
    }

    public DataItem(ModelView modelView)
    {
        this.modelView = modelView;
    }
}

RelativeSource有效,但我不認為讓控件在彼此的屬性中徘徊是正確的。 奇怪的是,放置在項目視圖中的按鈕使用外部數據源而不是綁定項目執行某些操作。 您可能需要查看程序代碼的設計。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM