Использование функции привязки Caliburn.Micro на «внутреннем» пользовательском элементе управления - PullRequest
4 голосов
/ 16 мая 2011

Я совершенно новичок в Caliburn.Micro, так что я думаю, что у этого есть простой ответ (или, по крайней мере, я надеюсь, что он имеет:))

У меня есть ViewModel со свойством под названием ConnectedSystem, у которого есть под-свойство с именем Name.

В моем представлении у меня есть следующий XAML (отрывок):

<StackPanel Orientation="Horizontal">
  <Label Content="Name:" />
  <TextBlock x:Name="ConnectedSystem_Name" />
</StackPanel>

Это прекрасно работает, и имя отображается в TextBlock, как и ожидалось. Тем не менее, ConnectedSystem имеет около 10 свойств, которые должны отображаться, и я не хочу копировать и вставлять XAML выше 10 раз в моем представлении. Вместо этого я хочу извлечь этот XAML как UserControl, где я могу установить LabelText и Text в качестве свойств.

Я пробовал это, но я не уверен, как получить Caliburn.Micro для автоматической передачи ConnectedSystem_Name в свой UserControl.

Это может быть лучше, чем использование UserControl и здесь, поэтому вопрос в основном: каков наилучший способ использовать этот общий XAML в качестве собственного элемента управления, и при этом использовать привязку Caliburn.Micros.

Ответы [ 3 ]

4 голосов
/ 17 мая 2011

Что вам нужно сделать, это использовать ContentControl на главном экране, чтобы отобразить свойство ConnectedSystem модели основного вида.Используя ContentControl, вы будете включены в процесс привязки модели представления, и будут применены правила привязки модели представления.Таким образом, вы хотите, чтобы ваше свойство (используя реализацию Caliburn по умолчанию) имело тип ConnectedSystemViewModel и имело представление с именем ConnectedSystemView.Затем в представлении, используемом для отображения родительского элемента, вы хотите ContentControl с x:Name, равным ConnectedSystem (имя свойства ConnectedSystemViewModel. Это приведет к тому, что связыватель модели представления соединит их и выполнит свою обычную работу. ЗдесьВот некоторый код для ясности:

ConnectedSystemView.xaml (пользовательский элемент управления, который соглашения будут использовать при указании ContentControl в качестве элемента управления для отображения свойства подключенной системы модели основного вида)

<UserControl x:Class="Sample.Views.ConnectedSystemView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>

        <Label Grid.Column="0"
                   Grid.Row="0">PropertyOne Label:</Label>
        <TextBox x:Name="PropertyOne"
                 Grid.Column="1"
                 Grid.Row="0"></TextBox>

        <TextBlock Grid.Column="0"
                   Grid.Row="1">PropertyTwo Label:</TextBlock>
        <TextBox x:Name="PropertyTwo"
                 Grid.Column="1"
                 Grid.Row="1"></TextBox>

        <!-- repeat the TextBlock, TextBox pair for the remaining
             properties three through ten -->
    </Grid>
</UserControl>

ConnectedSystemViewModel.cs (тип свойства ConnectedSystem в вашей модели основного вида)

namespace Sample.ViewModels
{
    public class ConnectedSystemViewModel : PropertyChangedBase
    {
        private string _propertyOne;
        public string PropertyOne
        {
            get { return _propertyOne; }
            set
            {
                _propertyOne = value;
                NotifyOfPropertyChange(() => PropertyOne);
            }
        }

        // these all need to be as above with NotifyPropertyChange,
        // omitted for brevity.
        public string PropertyTwo { get; set;}
        public string PropertyThree { get; set;}
        public string PropertyFour { get; set;}
        public string PropertyFive { get; set;}
        public string PropertySix { get; set;}
        public string PropertySeven { get; set;}
        public string PropertyEight { get; set;}
        public string PropertyNine { get; set;}
        public string PropertyTen { get; set;}
    }
}

И в вашем главном представлении определите ContentControl с именем относительно свойства модели основного вида типа ConnectedSystemViewModel

<ContentControl x:Name="ConnectedSystem"></ContentControl>

Если я правильно понимаю ваш вопрос, это все, что вам нужно, чтобы подключиться к стандартным соглашениям Caliburn.Micro. Очевидно, вы добавите свойства 10 ConnectedSystem в ConnectedSystemViewModel и соответствующие элементы управления с соответствующими именами для ConnectedSystemView для завершения реализации.

Таким образом, в вашем основном видевам нужно определить только один ContentControl для отображения свойства ConnectedSytem (вместо 10 идентичных пользовательских пользовательских элементов управления), и соглашения будут определять тип пользовательского элемента управления, который будет использоваться для заполнения ContentControl.

ВнутриConnectedSystemView, который будет вставлен в свойство содержимого ваших основных представлений ContentControl через соглашения, у вас есть элементы управления, которые вы хотите отобразить в 10 подключенных системных свойствах.

3 голосов
/ 16 мая 2011

Caliburn.Micro плохо справляется с автоматическим связыванием нескольких элементов с одним элементом управления. Однако вам не нужно полагаться на автоматическое связывание, вместо этого вы можете использовать простую старую привязку wpf.

A UserControl - путь сюда. В коде вы можете добавить два DependencyProperties, LabelText и Text.

Затем в XAML для вашего UserControl свяжите с новыми свойствами.

Там, где вы используете этот элемент управления, теперь вы можете установить значения LabelText и Text в XAML. Поэтому в главном представлении добавьте элемент управления и привяжите LabelText и Text к свойствам в вашей модели представления.

0 голосов
/ 06 июля 2012

Если вы просто хотите отобразить или установить свойство, мой подход такой:

public String ConnectedSystemName
{
    get { return _connectedSystem.Name; }
    set
    {
        _connectedSystem.Name = value;
        NotifyOfPropertyChange(() => _connectedSystem.Name);
    }
}

Если вы хотите отобразить или установить свойство из родительского элемента управления пользователя, вы можете создать вложенное свойство для привязки к пользовательскому элементу управления, то есть получить / установить свойство из элемента управления пользователя

...