ฉันรู้ว่านี่เป็นโพสต์เก่า แต่บางคนอาจพบว่าข้อมูลนี้มีประโยชน์ สมมติว่าคุณได้ผูกมุมมองของคุณเข้ากับโมเดลมุมมองของคุณ จากนั้นคุณสามารถผูก ContextMenu.DataContext
ของคุณเข้ากับโมเดลมุมมองของคุณได้ด้วยวิธีต่อไปนี้:
ขั้นแรก ตั้งชื่อมุมมองของคุณ UserControl
... โดยทั่วไปฉันจะตั้งชื่อทั้งหมดของฉัน This
เพื่อความเรียบง่าย จากนั้นเมื่อจำได้ว่าโมเดลมุมมองของเราเชื่อมโยงกับ DataContext
ของ UserControl
เราก็สามารถผูกกับโมเดลมุมมองโดยใช้ {Binding DataContext, ElementName=This}
ได้
ตอนนี้เราสามารถผูกกับโมเดลมุมมองได้แล้ว เราต้องเชื่อมต่อกับ ContextMenu.DataContext
ฉันใช้คุณสมบัติ Tag
ของออบเจ็กต์กับ ContextMenu
(PlacementTarget
) เป็นการเชื่อมต่อนั้น ในตัวอย่างนี้ Grid
:
<DataTemplate x:Key="YourTemplate" DataType="{x:Type DataTypes:YourDataType}">
<Grid ContextMenu="{StaticResource Menu}" Tag="{Binding DataContext,
ElementName=This}">
...
</Grid>
</DataTemplate>
จากนั้นเราสามารถเข้าถึงคุณสมบัติโมเดลมุมมองและคำสั่งใน ContextMenu
โดยการผูกคุณสมบัติ ContextMenu.DataContext
กับคุณสมบัติ PlacementTarget.Tag
(ของ Grid
ในตัวอย่างของเรา):
<ContextMenu x:Key="Menu" DataContext="{Binding PlacementTarget.Tag, RelativeSource=
{RelativeSource Self}}">
<MenuItem Header="Delete" Command="{Binding DeleteFile}" CommandParameter=
"{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource
AncestorType=ContextMenu}}" CommandTarget="{Binding PlacementTarget,
RelativeSource={RelativeSource Self}}" />
</ContextMenu>
สังเกตการเชื่อมโยงกับคุณสมบัติ MenuItem.CommandTarget
การตั้งค่านี้ช่วยให้แน่ใจว่าองค์ประกอบเป้าหมายที่คำสั่งที่ระบุถูกยกขึ้นคือ PlacementTarget
หรือ Grid
ในกรณีนี้
โปรดสังเกตการเชื่อมโยง CommandParameter
ด้วย ซึ่งจะผูกกับ DataContext
ของ PlacementTarget
หรือ Grid
ในกรณีนี้ DataContext
ของ Grid
จะได้รับการสืบทอดมาจาก DataTemplate
ดังนั้นรายการข้อมูลของคุณจึงถูกผูกไว้กับพารามิเตอร์ object
ใน Command
ของคุณ หากคุณใช้อินเทอร์เฟซ ICommand
บางอย่าง:
public bool CanExecuteDeleteFileCommand(object parameter)
{
return ((YourDataType)parameter).IsInvalid;
}
public void ExecuteDeleteFileCommand(object parameter)
{
Delete((YourDataType)parameter);
}
หรือหากคุณใช้ผู้รับมอบสิทธิ์ RelayCommand
บางประเภทโดยตรงในโมเดลมุมมองของคุณ:
public ICommand Remove
{
get
{
return new ActionCommand(execute => Delete((YourDataType)execute),
canExecute => return ((YourDataType)canExecute).IsInvalid);
}
}
person
Sheridan
schedule
09.03.2013