上下文菜单绑定到父窗口的数据上下文

Hel*_*lic 6 wpf datacontext binding c#-4.0

我有一个 TreeListControl 绑定到我的虚拟机中的一个集合。我还想在树列表控件内定义上下文菜单,使其标题文本绑定到虚拟机中的另一个字符串。在这种情况下如何设置数据上下文?我尝试过了

<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>
Run Code Online (Sandbox Code Playgroud)

但它不起作用。

这是视图模型

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";
}
Run Code Online (Sandbox Code Playgroud)

lis*_*isp 5

这绑定到Window

DataContext="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
Run Code Online (Sandbox Code Playgroud)

如果在 上定义了命令AddItemCommand和属性,则绑定到:AddItemTextWindow ViewModelWindow DataContext

DataContext="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext}"
Run Code Online (Sandbox Code Playgroud)

  • 这不起作用,因为 ContextMenu 不在可视化树中,因此它永远找不到 x:Type Window (2认同)

Ωme*_*Man 5

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

<window  x:Name="ReportsPage"/>

...

 <MenuItem DataContext="{Binding ElementName=ReportsPage}"/>
Run Code Online (Sandbox Code Playgroud)

更新

由于上下文菜单实际上位于其自己的窗口中,因此绑定有点棘手。因此,最好的选择是走到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>
Run Code Online (Sandbox Code Playgroud)

对于这个上下文产生这个

在此输入图像描述