WPF MVVM مشكلة ربط القائمة الفرعية الديناميكية

StackOverflow https://stackoverflow.com/questions/4246503

  •  27-09-2019
  •  | 
  •  

سؤال

أقوم بإنشاء قائمة سياق ديناميكية وعناصر القائمة بها أطفال. في المرة الأولى حول القائمة الفرعية ، ولكن في الثانية وهناك بعد عرض قوائم الوالدين فقط. القائمة الفرعية للطفل موجودة في المجموعة المرتبطة بقائمة السياق التي لا تظهر.

Vmmenuitems هو خاصية في نموذج العرض الخاص بي وهو

ObservableCollection<MenuItemViewModel>

في كل مرة يتم فيها إعادة بناء البيانات الموجودة في ListView VMMENUITEMS تمامًا. القائمة الفرعية هي مجرد إضافة menuitemviewmodel أخرى إلى أطفال menuitemviewmodel الحاليين. أي أفكار حول كيفية جعل القوائم الفرعية تعمل في كل مرة؟

الرمز

<Window.Resources>        
    <HierarchicalDataTemplate DataType="{x:Type local:MenuItemViewModel}"
                              ItemsSource="{Binding Path=Children}">
        <ContentPresenter Content="{Binding Path=MenuText}" />
    </HierarchicalDataTemplate>
</Window.Resources>

 <ListView.ContextMenu>
       <ContextMenu ItemsSource="{Binding Path=VMMenuItems>
          <ContextMenu.ItemContainerStyle>
              <Style TargetType="{x:Type MenuItem}">                                    
                 <Setter Property="Command" Value="{Binding Command}"/>
                  <Setter Property="CommandParameter" Value="{Binding MenuText}"/> 
                            </Style>
                        </ContextMenu.ItemContainerStyle>
                    </ContextMenu>                       
                </ListView.ContextMenu>

public class MenuItemViewModel : ViewModel
{  
    public MenuItemViewModel()
    {
        Children = new ObservableCollection<MenuItemViewModel>();
    }


    private string _menuText;
    public string MenuText
    {

        get { return _menuText; }

        set
        {
            _menuText = value;
            OnPropertyChanged("MenuText");
        }
    }


    private bool _isEnabled;
    public bool IsEnabled
    {
        get { return _isEnabled; }

        set
        {
            _isEnabled = value;
            OnPropertyChanged("IsEnabled");
        }
    }


    private ICommand _command;
    public ICommand Command
    {
        get { return _command; }

        set
        {
            _command = value;
            OnPropertyChanged("Command");
        }
    }

    private ObservableCollection<MenuItemViewModel> _children;
    public ObservableCollection<MenuItemViewModel> Children
    {
        get { return _children; }

        set
        {
            _children = value;
            OnPropertyChanged("Children");
        }
    }
هل كانت مفيدة؟

المحلول

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

<ContextMenu.ItemContainerStyle>
  <Style TargetType="{x:Type MenuItem}">
   <Setter Property="Header" Value="{Binding MenuText}"/>
   <Setter Property="ItemsSource" Value="{Binding Path=Children}"/>
   <Setter Property="Command" Value="{Binding Command}"/>
   <Setter Property="CommandParameter" Value="{Binding MenuText}"/>
  </Style>
 </ContextMenu.ItemContainerStyle>

نصائح أخرى

ما زلت جديدًا على هذا بنفسي ولا أعرف بالتأكيد دون اختباره أو السبب بالضبط ، لكنني أعتقد أن الأمر يتعلق باستبدال مجموعة الأطفال بمجموعة جديدة تمامًا. أعتقد أن ذلك سيتطلب إعادة ربط المجموعة. سيكون من الأفضل إضافة/إزالة العناصر من المجموعة الحالية. هذا من شأنه أن يؤدي إلى الإخطارات الملزمة المناسبة. في الوقت الحالي ، يكون الربط هو مثيل معين لتلك المجموعة التي يتم استبدالها على استدعاء الأطفال. أتمنى أن يساعدك هذا.

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