هل هناك طريقة لربط أمر بالحدث المنهار لجميع TreeViewItems في TreeView؟
-
01-10-2019 - |
سؤال
أحاول أن أفعل شيئًا مشابهًا لما الشخص فيه هذه أراد السؤال القيام به.
هل هناك أي, ، أكثر أناقة ، طريقة للقيام بذلك من العمل المقترح هناك؟
(كملاذ أخير) ، هل هناك إطار عمل MVVM مختلف سيكون له دعم أفضل للقيام بذلك؟
الآن أحاول إجراء عنصر تحكم مخصص يرث من TreeView ، مثل هذا:
public ModdedTreeView()
{
this.AddHandler(TreeViewItem.CollapsedEvent, new RoutedEventHandler(ItemCollapsed));
}
public RelayCommand<RoutedEventArgs> ItemCollapsedCommand
{
get { return (RelayCommand<RoutedEventArgs>)GetValue(ItemCollapsedCommandProperty); }
set { SetValue(ItemCollapsedCommandProperty, value); }
}
// Using a DependencyProperty as the backing store for ItemCollapsedCommand. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ItemCollapsedCommandProperty =
DependencyProperty.Register("ItemCollapsedCommand", typeof(RelayCommand<RoutedEventArgs>), typeof(ModdedTreeView), new UIPropertyMetadata(null));
protected void ItemCollapsed(object sender, RoutedEventArgs e)
{
if (ItemCollapsedCommand != null)
ItemCollapsedCommand.Execute(e);
}
أود بعد ذلك ربط الأمر الذي أريد إطلاقه ، إلى خاصية ItemCollapsedCommand التبعية. لكن حتى هذا لا يعمل.
ما زلت أحصل على InvalidOperationException
: "تم تعليق معالجة المرسل ، ولكن لا تزال الرسائل تتم معالجتها."
أيه أفكار؟
المحلول
لم أستخدم فئة "EventTocommand" الموصوفة في الرابط الذي أشرت إليه. لكن جرب واحد في هذا المنشور: http://sachabarber.net/؟p=514. لقد كتبت للتو عينة صغيرة باستخدام فئة CommandBehavior في هذا المنشور وتمكنت من إرفاق الأمر بحدث isCollapsed لـ treeviewitem مع Xaml التالي:
<TreeView>
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="local:CommandBehavior.TheCommandToRun" Value="{Binding MyCommand}"/>
<Setter Property="local:CommandBehavior.RoutedEventName" Value="Collapsed"/>
</Style>
</TreeView.ItemContainerStyle>
<TreeViewItem Header="Item">
<TreeViewItem Header="Item">
<TreeViewItem Header="Item"/>
</TreeViewItem>
</TreeViewItem>
</TreeView>