0

Как отобразить ListBox в режиме разработчика в MenuControl.xaml ?

В MainWindow.xaml отображается.

По материалам: Обратиться из UserControl к MainWindow MVVM Проект: https://github.com/jhon65496/QDisplayListBoxInUC

введите сюда описание изображения

MainWindow.xaml

<Window x:Class="MasterDetail0202Detail.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MasterDetail0202Detail"
        mc:Ignorable="d"
        d:DataContext="{d:DesignInstance Type=local:MainWindowViewModel , IsDesignTimeCreatable=True}"
        Title="MainWindow" Height="450" Width="800">
    <Grid Margin="0,1,0,-1">                
        <GroupBox Header="Master" Grid.Column="0" Grid.Row="1">                           
                <local:MenuControl DockPanel.Dock="Bottom" ItemsSource="{Binding MenuItems}" SelectedItem="{Binding SelectedMenuItem, Mode=TwoWay}"/>            
        </GroupBox>        
    </Grid>
</Window>

MenuControl.xaml

<UserControl x:Class="MasterDetail0202Detail.MenuControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:MasterDetail0202Detail"             
             Background="White"
             mc:Ignorable="d"              
             x:Name="Control" 
             d:DataContext="{d:DesignInstance Type=local:MainWindowViewModel , IsDesignTimeCreatable=True}"
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <GroupBox Header="Меню" >
            <ListBox ItemsSource="{Binding ElementName=Control, Path=ItemsSource}"                   
                 SelectedIndex="1"
                 SelectedItem="{Binding ElementName=Control, Path=SelectedItem}">
                <ListBox.ItemTemplate>
                    <DataTemplate >
                        <DockPanel>
                            <TextBlock Text="{Binding Path=Name}" Margin="3"/>
                            <TextBlock Text="{Binding Path=State}" Margin="3"/>
                        </DockPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
        &lt;/ListBox&gt;
    &lt;/GroupBox&gt;
&lt;/Grid&gt;

</UserControl>

**MenuControl **

// <summary>
/// Логика взаимодействия для UserControl1.xaml
/// </summary>
public partial class MenuControl : UserControl
{
    public MenuControl()
    {
        InitializeComponent();
    }
public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register(
            &quot;ItemsSource&quot;, 
            typeof(IEnumerable), 
            typeof(MenuControl), 
            new PropertyMetadata(default(IEnumerable)));

public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.Register(
            &quot;SelectedItem&quot;, 
            typeof(object), 
            typeof(MenuControl), 
            new PropertyMetadata(default(object)));

public IEnumerable ItemsSource
{
    get =&gt; (IEnumerable)GetValue(ItemsSourceProperty);
    set =&gt; SetValue(ItemsSourceProperty, value);
}

public object SelectedItem
{
    get =&gt; GetValue(SelectedItemProperty);
    set =&gt; SetValue(SelectedItemProperty, value);
}

}

App.xaml.cs

public partial class App : Application
{
public App()
{
    MainWindowViewModel mainViewModel = new MainWindowViewModel();

    var mainWin = new MainWindow();
    mainWin.DataContext = mainViewModel;
    mainWin.WindowStartupLocation = WindowStartupLocation.CenterScreen;
    mainWin.Show();
}

}

MainWindowViewModel

internal class MainWindowViewModel : BaseVM
{
public ObservableCollection&lt;MenuItem&gt; MenuItems { get; set; }

public TestDataContext dataContext;

public MainWindowViewModel()
{
    dataContext = new TestDataContext();

    LoadMenuItems();
}


private BaseVM currentContent;
public BaseVM CurrentContent
{
    get =&gt; currentContent;
    set
    {
        currentContent = value;
        RaisePropertyChanged();
    }
}


private MenuItem selectedMenuItem;

public MenuItem SelectedMenuItem
{
    get { return selectedMenuItem; }
    set
    {
        selectedMenuItem = value;
        RaisePropertyChanged();
        Debug.WriteLine(&quot;MainWindowViewModel--Prop--SelectedMenuItem&quot;);
    }
}

/// &lt;summary&gt;
/// Загрузка списка меню
/// &lt;/summary&gt;
private async void LoadMenuItems()
{
    //Загрузка списка меню
    var menuItems = await dataContext.GetMenuItemsAsync();
    this.MenuItems = new ObservableCollection&lt;MenuItem&gt;(menuItems);

}

}

BaseVM

class BaseVM : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public void RaisePropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
internal class MenuItem
{
    public int Id { get; set; }
    public int Sort { get; set; }
    public string Name { get; set; }
    public string NameVm { get; set; }        
    public string State { get; set; }
    public BaseVM ViewModel { get; set; }

}

class TestDataContext
{
    // private readonly List<MenuItem> _people;

    public ObservableCollection<MenuItem> MenuItems { get; set; }
    //ctor
    public TestDataContext()
    {
        MenuItems = new ObservableCollection<MenuItem>()
        {
            new MenuItem {Name = "Страница 1", NameVm = "FirstPageViewModel", State  = "Статус1"},
            new MenuItem {Name = "Страница 2", NameVm = "SecondPageViewModel", State = "Статус1"}
        };

    }


    public Task<IEnumerable<MenuItem>> GetMenuItemsAsync()
    {   
        return Task.FromResult(MenuItems.AsEnumerable());
    }
}

Update-1

https://github.com/jhon65496/QDisplayListBoxInUC

MainWindow.xaml

<Window x:Class="MasterDetail0202Detail.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MasterDetail0202Detail"
        mc:Ignorable="d"
        d:DataContext="{d:DesignInstance Type=local:MainWindow, IsDesignTimeCreatable=True}"
        Title="MainWindow" Height="450" Width="800">
    <Grid Margin="0,1,0,-1">                
        <GroupBox Header="Master" Grid.Column="0" Grid.Row="1">                           
                <local:MenuControl ItemsSource="{Binding MenuItems}" SelectedItem="{Binding SelectedMenuItem, Mode=TwoWay}"/>            
        </GroupBox>        
    </Grid>
</Window>

MenuControl.xaml

<UserControl x:Class="MasterDetail0202Detail.MenuControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:MasterDetail0202Detail"             
             Background="White"
             mc:Ignorable="d"              
             x:Name="Control"
         d:DesignHeight=&quot;450&quot; d:DesignWidth=&quot;800&quot;&gt;
&lt;Grid&gt;
    &lt;GroupBox Header=&quot;Меню&quot; &gt;
        &lt;ListBox ItemsSource=&quot;{Binding ElementName=Control, Path=ItemsSource}&quot;                   
             SelectedIndex=&quot;1&quot;
             SelectedItem=&quot;{Binding ElementName=Control, Path=SelectedItem}&quot;&gt;
            &lt;ListBox.ItemTemplate&gt;
                &lt;DataTemplate &gt;
                    &lt;DockPanel&gt;
                        &lt;TextBlock Text=&quot;{Binding Path=Name}&quot; Margin=&quot;3&quot;/&gt;
                        &lt;TextBlock Text=&quot;{Binding Path=State}&quot; Margin=&quot;3&quot;/&gt;
                    &lt;/DockPanel&gt;
                &lt;/DataTemplate&gt;
            &lt;/ListBox.ItemTemplate&gt;

        &lt;/ListBox&gt;
    &lt;/GroupBox&gt;
&lt;/Grid&gt;

</UserControl>

eusataf
  • 249
  • 1
  • 8
  • Комментарии были перемещены в чат; пожалуйста, не продолжайте дискуссию здесь. Прежде чем разместить комментарий ниже этого, пожалуйста, ознакомьтесь с назначением комментариев. Комментарии, которые не запрашивают уточнения или не предлагают улучшения, скорее всего должны быть ответами, размещены на [meta] или написаны в [chat]. Комментарии, продолжающие дискуссию, могут быть удалены. – αλεχολυτ Oct 06 '23 at 21:07

0 Answers0