UWP + Prism MVVM - Как установить значение свойства модели представления через XAML? - PullRequest
0 голосов
/ 09 октября 2018

У меня есть свойство в модели представления, которое я хотел бы установить через XAML, но я не могу понять, как это сделать.У меня есть довольно простой пользовательский элемент управления (содержащий список элементов), два из которых должны быть размещены на странице, и я хотел бы иметь возможность установить один для «Source» (определяется перечислением) и один длябыть 'Target'.

[Код, приведенный ниже, был несколько урезан, поэтому извиняюсь, если я случайно допустил некоторые ошибки или что-то упустил.]

Мое перечисление:

public enum ConversionSide
{
    Source, // Convert something FROM whatever is here.
    Target  // Convert something TO whatever is here.
}

У меня есть страница, которая выглядит следующим образом:

<Page
    x:Class="MyApp.Views.ConverterPage"
    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:models="using:MyApp.Models"
    xmlns:my="using:MyApp.Controls"
    xmlns:prismMvvm="using:Prism.Windows.Mvvm"
    prismMvvm:ViewModelLocator.AutoWireViewModel="True"
    Style="{StaticResource PageStyle}"
    mc:Ignorable="d">

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*" />
            <ColumnDefinition Width="1*" />
        </Grid.ColumnDefinitions>
        <my:SelectorPage Name="SourceSelector" Grid.Column="0" />
        <my:SelectorPage Name="TargetSelector" Grid.Column="1" />
    </Grid>

</Page>

... где SelectorPage - это пользовательский элемент управления (я назвал его «Страница», чтобы сделать Prism AutoWireработать, но это не проблема здесь), содержащий список элементов (все работает нормально), который выглядит следующим образом ...

<UserControl
    x:Class="MyApp.Controls.SelectorPage"
    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:models="using:MyApp.Models"
    xmlns:my="using:MyApp.Controls"
    xmlns:prismMvvm="using:Prism.Windows.Mvvm"
    prismMvvm:ViewModelLocator.AutoWireViewModel="True"
    mc:Ignorable="d">

    <ListView
        Grid.Column="0"
        ItemsSource="{x:Bind ViewModel.MyList, Mode=OneWay}"
        SelectedItem="{x:Bind ViewModel.MySelectedItem, Mode=TwoWay}">
        <ListView.Header>
            <TextBlock Margin="0,8,0,8" HorizontalAlignment="Center" FontStyle="Italic" Text="Header Text" />
        </ListView.Header>
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="models:MyListItem">
                <my:MyListItemTemplate />
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

</UserControl>

.. с кодом позади ...

public sealed partial class SelectorPage : UserControl
{
    private SelectorViewModel ViewModel => DataContext as SelectorViewModel;

    public SelectorPage()
    {
        this.InitializeComponent();
    }
}

SelectorViewModel выглядит следующим образом ...

public class SelectorViewModel : ViewModelBase
{
    private ConversionSide _side;

    public ConversionSide Side
    {
        get { return _side; }
        set { SetProperty(ref _side, value); }
    }

    // Many lines have been omitted for 'clarity'.
}

Я хотел бы иметь возможность установить свойство Side для SelectorViewModel в XAML следующим образом ...

<my:SelectorPage Name="SourceSelector" Grid.Column="0" Side="Source" />
<my:SelectorPage Name="TargetSelector" Grid.Column="1" Side="Target" />

(Once Sideбыл установлен, я не ожидаю, что это когда-либо изменится.)

Как я могу это сделать?

Я посмотрелпри использовании свойства зависимости, но я не могу заставить его изменить свойство в SelectorViewModel.Когда я добавляю один в SelectorPage, он отображается в XAML, и я могу установить его, но на самом деле он ничего не делает, поэтому я, вероятно, неправильно его использую.Помещение свойства зависимости в модель представления мне не подходит, но я могу ошибаться.Я просматривал Интернет - документацию Microsoft, блоги, статьи, переполнение стека и т. Д. - но не могу найти ничего, что достаточно хорошо объясняет вещи, чтобы я мог понять, что я должен делать.Похоже, что статьи, которые я нашел, посвящены исключительно получению информации из связанного свойства, с которым у меня все в порядке, но мне нужно, чтобы установил свойство из XAML.

Может кто-нибудь дать мне какие-нибудь подсказки, пожалуйста?Я не знаю, нахожусь ли я в шаге от того, чтобы получить то, что хочу, или на расстоянии многих миль.

1 Ответ

0 голосов
/ 09 октября 2018

Это установит для свойства Side элемента управления SelectorPage значение Source:

Представление устанавливает свойство модели представления путем двусторонней привязки к нему.,Например, следующий TextBox устанавливает свойство string модели представления с именем Test, когда вы изменяете текст в TextBox:

<TextBox Text="{Binding Test, Mode=TwoWay}" />

Итак, устанавливая свойство модели представленияиз представления обычно применяется к элементам управления, которые обрабатывают некоторый вид ввода.Любое значение по умолчанию для исходного свойства должно быть определено в модели представления:

private ConversionSide _side = ConversionSide.Source;

Не следует определять значения по умолчанию в представлении.

...