Вставьте пользовательский элемент управления в диалоге Material Design WPF - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь понять дизайн материала в xaml в WPF и в данный момент я работаю над Dialog Host.Я пытался поместить UserControl в хост диалогового окна дизайна материала, но почему-то это не работает, я использую дизайн материала с Caliburn Micro FW.

MainView.xaml

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <!--ROW 0-->
    <Button Content="Show Dialog" Grid.Row="0" Grid.Column="0" x:Name="OpenDialog"/>
    <!--ROW 1-->
    <materialDesign:DialogHost Grid.Row="1" Grid.Column="0" IsOpen="{Binding IsDialogOpen}" CloseOnClickAway="True">
        <materialDesign:DialogHost.DialogContent>
            <StackPanel Margin="20">
                <ContentControl x:Name="ActiveItem"/>
            </StackPanel>
        </materialDesign:DialogHost.DialogContent>
    </materialDesign:DialogHost>
</Grid>

MainViewModel.cs

    private bool _isDialogOpen;
    public bool IsDialogOpen
    {
        get { return _isDialogOpen; }
        set
        {
            _isDialogOpen = value;
            NotifyOfPropertyChange(() => IsDialogOpen);
        }
    }

    public LoginViewModel()
    {
        MyCustomers.Add("Dhairya Joshi");
        MyCustomers.Add("Irfan Shethia");
        MyCustomers.Add("Imran Shethia");
    }

    public void OpenDialog()
    {
        IsDialogOpen = true;
        ActivateItem(new CustomersListViewModel());
    }

CustomerView.xaml

<StackPanel Orientation="Vertical">
    <ListBox x:Name="MyCustomers"/>
</StackPanel>

CustomerViewModel.cs

private List<string> _myCustomers = new List<string>();
    public List<string> MyCustomers
    {
        get { return _myCustomers; }
        set {
            _myCustomers = value;
            NotifyOfPropertyChange(() => MyCustomers);
        }
    }

    public CustomersListViewModel()
    {
        MyCustomers.Add("Dhairya Joshi");
        MyCustomers.Add("Irfan Shethia");
        MyCustomers.Add("Imran Shethia");
    }

Прямо сейчас это просто выглядит как этот снимок экрана

enter image description here.

ПРИМЕЧАНИЕ. Я попытался поместить <contentControl> в новую строку, и тот же код работает нормально, но он просто не отображается, когда я использую его в DialogHost.Пытался удалить StackPanel также и оставил только с <contentcontrol>, но он все еще не работает.

Обновление:

Наконец я смог привести его в рабочее состояние, но снова возникает другая проблема - ListBoxкоторый находится внутри пользовательского элемента управления, не заполняется.

Как мне удалось показать пользовательский элемент управления в диалоговом окне:

1) MainView.xaml

<materialDesign:DialogHost Grid.Row="2" Grid.Column="0" IsOpen="{Binding IsDialogOpen}" CloseOnClickAway="True" Identifier="RootDialog">

2) MainViewModel.cs

public async void OpenDialog()
    {
        //IsDialogOpen = true;


        var view = new CustomersListView
        {
            DataContext = new CustomerListViewModel();
        };

        //show the dialog
        var result = await DialogHost.Show(view, "RootDialog", ExtendedOpenedEventHandler, ExtendedClosingEventHandler);
    }

    private void ExtendedOpenedEventHandler(object sender, DialogOpenedEventArgs eventargs)
    {
        Console.WriteLine("Detecting Opened Event");
    }
    private void ExtendedClosingEventHandler(object sender, DialogClosingEventArgs eventArgs)
    {

    }

Если я запускаю usercontrol напрямую, то listview заполняется, но когда я делаю это внутри диалога, это не так.Не знаю почему.

1 Ответ

0 голосов
/ 04 ноября 2018

это очень хорошо работает

https://github.com/bebenins/DialogRefreshIssue

хороший замок

...