วิธีรับ PlacementTarget บนเมนูบริบท WPF เมื่อคลิกรายการโดยใช้รูปแบบ MVVM

วิธีรับ PlacementTarget ของ ContextMenu ที่เลือกเมื่อใช้รูปแบบ MVVM

ฉันสามารถรับ PlacementTarget เช่นนี้เมื่อใช้เหตุการณ์การคลิก MenuItem แต่มันจะทำ MVVM ได้อย่างไร?

   public void changeGaugeColor(object sender, RoutedEventArgs e)
    {
        MenuItem tempMenuItem = (MenuItem)sender;

        MenuItem mi = (MenuItem)sender;
        bd = (BidirectionalDial)cm.PlacementTarget;

    }

person Dinusha    schedule 08.07.2011    source แหล่งที่มา
comment
เป้าหมายตำแหน่งของคุณไม่ได้เป็นส่วนหนึ่งของการควบคุมผู้ใช้เดียวกันกับที่คุณสามารถเข้าถึงได้โดยตรงโดยใช้ this.yourControlName คุณกำลังพยายามทำอะไร   -  person anivas    schedule 08.07.2011
comment
คำถามต้องได้รับการแก้ไข! คุณต้องการอะไร?   -  person stukselbax    schedule 08.07.2011
comment
หาก ViewModel ของคุณกำลังมองหาเป้าหมายตำแหน่ง แสดงว่าคุณทำผิด นี่คือขอบเขตทั้งหมดของ View ไม่ใช่ ViewModel ปล่อยให้ View ทำงานทั้งหมดนี้จากโค้ดที่อยู่ด้านหลัง   -  person    schedule 08.07.2011


คำตอบ (1)


ฉันรู้ว่านี่เป็นโพสต์เก่า แต่บางคนอาจพบว่าข้อมูลนี้มีประโยชน์ สมมติว่าคุณได้ผูกมุมมองของคุณเข้ากับโมเดลมุมมองของคุณ จากนั้นคุณสามารถผูก 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