В WPF добавление объекта UserControl C# из ViewModel в View - PullRequest
0 голосов
/ 28 мая 2020

У меня есть UserControl в ViewModel, который является свойством в ViewModel. Я получу этот UserControl из какой-нибудь библиотеки DLL.

    private GraphicControl _graphicCtrl;

            public GraphicControl GraphicCtrl
            {
                get { return _graphicCtrl; }
                set
                {
                    _graphicCtrl = value;
                    NotifyPropertyChanged();
                }
            }

В указанном выше свойстве GraphicCtrl не что иное, как UserControl . Я хочу отобразить это в моем представлении (xaml). Итак, как мне этого добиться?

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Я хочу отобразить это в моем представлении (xaml). Итак, как мне этого добиться .?

Короткий ответ: используйте ContentControl и привяжите его свойство Content к UserControl:

<ContentControl Content="{Binding GraphicCtrl}" />

Как у других Как уже упоминалось, предоставление UserControl из модели представления не является MVVM.

Вы должны скорее предоставить объект данных POCO с именем Graphic или что-то в этом роде, а затем использовать DataTemplate для сопоставления этого типа с UserControl в виде:

<ContentControl Content="{Binding Graphic}">
    <ContentControl.ContentTemplate>
        <DataTemplate>
            <local:GraphicControl />
        </DataTemplate>
    </ContentControl.ContentTemplate>
</ContentControl>
1 голос
/ 28 мая 2020

Вот очень простой пример того, как разделить это

public class MainViewModel : ReactiveObject
{
    public MainViewModel()
    {
        Stuff = new ObservableCollection<object>
        {
            new Person { FirstName = "Jon", LastName="Doe", },
            new Car { Brand = "Ford", Model = "Model T" },
        };
    }
    public IEnumerable Stuff { get; }
    [Reactive] public object SelectedStuff { get; set; }
}

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Car
{
    public string Brand { get; set; }
    public string Model { get; set; }
}

Как видите, никакой зависимости от каких-либо элементов управления или других связанных с пользовательским интерфейсом вещей.

Теперь вид, в котором я решаю как представить данные из ViewModel

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200" />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <ListBox
          ItemsSource="{Binding Stuff}"
          SelectedItem="{Binding SelectedStuff}">
        <ListBox.Resources>
            <DataTemplate DataType="{x:Type local:Car}">
                <TextBlock>
                    <Run Text="{Binding Brand}" /><Run Text=" - " /><Run Text="{Binding Model}" />
                </TextBlock>
            </DataTemplate>
            <DataTemplate DataType="{x:Type local:Person}">
                <TextBlock>
                    <Run Text="{Binding FirstName}" /> <Run Text="{Binding LastName}" />
                </TextBlock>
            </DataTemplate>
        </ListBox.Resources>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <ContentPresenter Content="{Binding}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

    <ContentControl
          Grid.Column="1"
          Content="{Binding SelectedStuff}">
        <ContentControl.Resources>
            <DataTemplate DataType="{x:Type local:Car}">
                <local:CarControl/>
            </DataTemplate>
            <DataTemplate DataType="{x:Type local:Person}">
                <local:PersonControl/>
            </DataTemplate>
        </ContentControl.Resources>
    </ContentControl>
</Grid>

CarControl

<StackPanel>
    <Label Content="Car" />
    <Label Content="Brand" />
    <TextBlock Text="{Binding Brand}" />
    <Label Content="Model" />
    <TextBlock Text="{Binding Model}" />
</StackPanel>

PersonControl

<StackPanel>
    <Label Content="Person" />
    <Label Content="FirstName" />
    <TextBlock Text="{Binding FirstName}" />
    <Label Content="LastName" />
    <TextBlock Text="{Binding LastName}" />
</StackPanel>

и, наконец, скриншот

MainWindow Screenshot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...