này có vẻ là một chủ đề khá phổ biến, nhưng ...Làm thế nào để truy cập một điều khiển từ một menuitem ContextMenu thông qua cây thị giác?
Tôi có XAML sau:
<internal:MyCommandObject x:Name="CommandModel"/>
<Button DockPanel.Dock="Bottom" Command="{Binding DoAction, ElementName=CommandModel}">
<Button.ContextMenu>
<ContextMenu DataContext="{Binding PlacementTarget, RelativeSource={RelativeSource Self}}">
<MenuItem Command="{Binding DoAction, ElementName=CommandModel}"/>
</ContextMenu>
</Button.ContextMenu>
Click Me
</Button>
Bây giờ, MyCommandObject
là một điều khiển mà exposes lệnh động từ DataContext
của nó. Bạn biết điều gì sẽ xảy ra tiếp theo. :)
Về cơ bản, lệnh nút hoạt động hoàn hảo - khi tôi nhấp vào, lệnh DoAction
trên MyCommandObject
được thực thi hoàn hảo. Tuy nhiên, lệnh trong menuitem không được thực thi. Tôi đã thử các thủ thuật khác nhau như thiết lập menu ngữ cảnh datacontext
thành placementTarget
để nó có thể duyệt qua cây trực quan của các điều khiển và vân vân, nhưng không có gì làm.
Điều chỉnh cụ thể của RelativeSource
và CommandTarget
rune nào tôi có cần phải thực hiện việc này?
Cảm ơn vì điều này. Tôi đang cố gắng không sử dụng code-behind nếu có thể - có thể xác định NameScope trong XAML không? Thật không may, tôi không thể đặt ngữ cảnh dữ liệu của mục menu thành nút hiển thị lệnh. Đây là một menu ngữ cảnh cho một lưới, và tôi cần DataContext của mục đã chọn để tôi có thể chuyển các thuộc tính từ đó như các tham số cho lệnh. – Webreaper
Lý do không sử dụng mã phía sau là xaml không được biên dịch - mọi thứ được thực hiện trong ứng dụng khách khi chạy bằng cách sử dụng kết buộc muộn. – Webreaper
@Webreaper Bạn không chắc chắn liệu bạn đang nói về kịch bản của bạn hay trong genral, nhưng hầu hết các tệp XAML được biên dịch thành BAML tại thời điểm xây dựng (xem xaml của bạn cũng trông như vậy); Tôi sẽ đề nghị bạn giới thiệu các liên kết này - [Biên dịch XAML = BAML không phải IL] (http://blogs.microsoft.co.il/blogs/tomershamam/archive/2007/05/25/Compiled-XAML-\_3D00\_ -BAML-not-IL.aspx) và [B là dành cho ... BAML] (http://blogs.msdn.com/b/jimoneil/archive/2009/01/12/b-is-for-baml.aspx) – akjoshi