سؤال

لدي TreeView نموذجي و ViewModel. يحتوي ViewModel على مجموعة يمكن ملاحظتها من مواديل ViewModels الأخرى التي تعمل كمصدر بيانات للشجرة.

public class TreeViewVM {
    public ObservableCollection<ItemVM> Items { get; private set; }
    public ItemVM SelectedItem { get; set; }
}

و itemVM:

public class ItemVM {
    public string Name { get; set; }
    public ImageSource Image { get; private set; }
    public ObservableCollection<ItemVM> Children { get; private set; }
    public ICommand Rename { get; private set; }
}

المنظر :

<TreeView Selecteditem="{Binding SelectedItem}" ItemsSource="{Binding Items}">
    <TreeView.ItemTemplate>
         <HierarchicalDataTemplate>
             <StackPanel Orientation="Horizontal">
                 <StackPanel.InputBindings>
                     <KeyBinding Key="F2" Command="{Binding Rename}"/>
                 </StackPanel.InputBindings>
                 <Image Source="{Binding Image}"/>
                 <TextBlock Text="{Binding Name}"/>
         </HierarchicalDataTemplate>
      </TreeView.ItemTemplate>
  </TreeView>

ومع ذلك ، لن يتم الاحتجاج بأمرتي بغض النظر عن ما أحاوله طالما أنه "من الداخل" الهرمي.

إذا قمت بنقل المفاتيح في treeview.inputBindings (و icommand / relayCommand من itemvm إلى treeviewvm) ، كل شيء لطيف ، يتم الاحتجاج على الأمر.

لكنني أود الحصول على الأمر على itemVM (كما هو الحال مع المنطقي). أيه أفكار؟

هل كانت مفيدة؟

المحلول

يجب تحديد الربط الرئيسي على TreeViewItem ، لأن هذا هو العنصر مع التركيز. المشكلة هي أنه لا يمكنك تحديد روابط المفاتيح باستخدام نمط ، وهو ما تريد القيام به هنا.

هنا هو حل واحد يستخدم خاصية مخصصة مخصصة لإضافة عناصر إلى مجموعة InputBinding عبر نمط. لذا ، فأنت تريد استخدام شيء من هذا القبيل لتحديد أسلوبك ، والتي ستعينها إلى TreeView.itemContainerstyle.

نصائح أخرى

لكنني أود الحصول على الأمر على itemVM (كما هو الحال مع المنطقي). أيه أفكار؟

إذا TreeViewVM يتتبع العنصر المحدد من خلال SelectedItem الخاصية يمكنك تحديدها InputBindings على TreeView ولا يزال لديك الأوامر التي تم تنفيذها على ItemVM:

<TreeView ItemsSource="{Binding Items}">
  <TreeView.InputBindings>
    <KeyBinding Key="F2" Command="{Binding SelectedItem.Rename}"/>
  </TreeView.InputBindings>
</TreeView>

لاحظ كيف أن بناء الجملة Subproperty SelectedItem.Rename يعمل لاستخدام ItemVM كمصدر للربط.

لسوء الحظ ، من الممل بعض الشيء ربط العنصر المحدد على أ TreeView. لا يمكنك الربط مباشرة إلى SelectedItem (كما يبدو أن XAML تقترح) ولكن هناك طرق مختلفة للتغلب على هذا القيد.

طريقة واحدة بسيطة هي الاستخدام يمزج التفاعل:

<TreeView Name="treeView" ItemsSource="{Binding Items}">
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectedItemChanged">
      <i:InvokeCommandAction Command="{Binding SetSelectedItemCommand}" CommandParameter="{Binding SelectedItem, ElementName=treeView}" />
    </i:EventTrigger>
  </i:Interaction.Triggers>
</TreeView>

سيكون عليك تنفيذ ملف SetSeletectedItemCommand على TreeViewVM هذا يضع العقار SelectedItem.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top