wpf - 上下文菜单绑定(bind)到父窗口的 Datacontext

标签 wpf c#-4.0 binding datacontext

我有一个 TreeListControl 绑定(bind)到我的 VM 中的集合。我还想在 treelistcontrol 中定义上下文菜单,使其标题文本绑定(bind)到我的 VM 中的另一个字符串。在这种情况下如何设置数据上下文?我试过了

<Window.DataContext>
    <model:ViewModel></model:ViewModel>
</Window.DataContext>
<Grid>
<Button Grid.Row="1"  Command="{Binding CellCheckedCommand}"></Button>

    <TextBlock Text="{Binding HeaderText}" Grid.Row="2">
        <TextBlock.ContextMenu>
            <ContextMenu>
                <MenuItem DataContext="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext}"  Header="{Binding HeaderText}"></MenuItem>
            </ContextMenu>
        </TextBlock.ContextMenu>
    </TextBlock>
</Grid>

但它不起作用。

这是 View 模型
public DelegateCommand CellCheckedCommand { get; set; }

private String _HeaderText;

public String HeaderText 
{
    get
    {
        return _HeaderText;
    }
    set
    {
        _HeaderText = value;
        NotifyPropertyChanged("HeaderText");
    }
}

public void NotifyPropertyChanged(String name)
{ 
    if(PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
}

private void CellCheckedMethod()
{
    HeaderText = "Changed";
}

最佳答案

为您的窗口提供一个名称并显式绑定(bind)到它,例如

<window  x:Name="ReportsPage"/>

...

 <MenuItem DataContext="{Binding ElementName=ReportsPage}"/>

更新

由于上下文菜单实际上在它自己的窗口中,因此绑定(bind)有点棘手。因此最好的选择是走上RelativeSource。到上下文的父级并从那里拉出标题文本:
    <Window.DataContext>
        <local:MainVM HeaderText="Jabberwocky" />
    </Window.DataContext>

    ...

<TextBlock Text="{Binding HeaderText}">
    <TextBlock.ContextMenu>
        <ContextMenu>

<MenuItem Header="{Binding Path=Parent.DataContext.HeaderText, 
                    RelativeSource={RelativeSource Self}}" />

        </ContextMenu>
    </TextBlock.ContextMenu>

在这种情况下会产生这个

enter image description here

关于wpf - 上下文菜单绑定(bind)到父窗口的 Datacontext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26359091/

相关文章:

c# - DataGridColumnHeader 中的第一个下划线被删除

c# - 如何将 ObservableCollection<LineSeries> 绑定(bind)到图表

wpf - 用于单按钮事件的 ICommand

delphi - 如何将 .NET COM 对象的实例从 Delphi 传递到另一个 .NET COM 对象?

asp.net-mvc-4 - 在 asp.net mvc 应用程序中集成 Power BI 报告

.net - 为什么 WPF 支持绑定(bind)到对象的属性而不是字段?

c# - 如何将绑定(bind)添加到数据网格中的列?

c# - 绑定(bind)突然获得旧值

c# - Wpf MVVM在DataGrid中选择/取消选择项目

c# - 从 WPF Web 浏览器静默打印 HTML