Как я могу смоделировать сложные ролевые отношения, где только определенные группы объектов могут принять участие в роли?

Ниже приведен простой пример того, как вы можете использовать DependencyProperty в UWP.

XAML

<Page x:Name="loginPage"
... >

<TextBlock Text="{Binding welcomeText,ElementName=loginPage}"></TextBlock>

C #

using Windows.UI.Xaml;
...
public string welcomeText
{
     get { return (string)GetValue(welcomeTextProperty); }
     set { SetValue(welcomeTextProperty, value); }
}

// Using a DependencyProperty as the backing store for welcomeText.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty welcomeTextProperty =
        DependencyProperty.Register("welcomeText", typeof(string), typeof(LoginPage), null);

В приведенном выше примере мы связываем зависимость свойство welcomeText, которое мы определяем в коде (C #) для TextBlock.

Обратите внимание, ElementName=loginPage - это имя страницы, которое мы определяем в XAML.

Надеюсь, это поможет.


РЕДАКТИРОВАТЬ 1:

Из того, что я могу понять из вашего кода, вы пытаетесь получить значение PropertyType, чтобы преобразовать его в другой тип.

Для этого требования вы можете сделать что-то вроде этого:

В следующем примере у нас есть специальный преобразователь значения, который преобразует длину строки в Visibility, другими словами, вернуть Visibility ] на основе длины строки, которую он получает для преобразования, а также проверяет, относится ли предоставленный тип value к типу string.

XAML

<Page x:Name="loginPage"
 xmlns:converters="using:projectName.converters"
... >
<Page.Resources>
    <converters:LengthToVisibilityConverter x:Key="lengthToVisibilityKey"></converters:LengthToVisibilityConverter>
</Page.Resources>
...
<TextBlock x:Name="flyoutTxt" Text="{Binding welcomeText,ElementName=loginPage}"></TextBlock>
<TextBlock Text="Has some text" Visibility="{Binding Path=Text,ElementName=flyoutTxt,Converter={StaticResource lengthToVisibilityKey}}"></TextBlock>

Здесь видимость второго TextBlock основана на длине текста flyoutTxt.

C #

Пользовательский класс преобразователя для преобразования длины в видимость:

class LengthToVisibilityConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {   //checking if type of "value" is String and its length
        if(value != null && value.GetType() == typeof(string) && 
           value.ToString().Length > 0)
        {
            return Visibility.Visible;
        }
        else
        {
            return Visibility.Collapsed;
        }

    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

Обратите внимание, что никаких изменений в зависимости свойства, определенной выше, не требуется. [Тысяча сто двадцать девять]

5
задан Daniel Rikowski 14 April 2009 в 17:29
поделиться

5 ответов

Если это - домашняя работа, она не может иметь значения... Но - если бы это будет используемым в реальном приложении, я настоятельно рекомендовал бы против использования реальных классов для каждого класса продукта т.е. Кока-колы, класса Салата, класса Rice, и т.д., как рекомендуется выше. Это - верный способ подать Вашу негибкую заявку.

Было бы намного лучше иметь класс продукта и класс напитка со свойством имени или некоторыми такой..

Предположите иметь необходимость восстановить свое целое приложение просто, потому что существует теперь новое специальное предложение или продукт... не прохладный ;).

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

Скажите фри, рис, и клинья принадлежат группе A. Напитки принадлежат группе B. Затем Вы могли смоделировать комбинацию, поскольку список групп - т.е. 1 группирует объект и 1 объект группы B, или два группируют объекты and1 объект группы B.

Вы могли также сделать продукты способными принадлежать нескольким группам одновременно... для создания опций более гибкими.

Модель дб могла получить сложное определение всех отношений, но я думаю, что это необходимо.

Возможно, что-то вроде этого:

group(id, name, desc) - группа подобных объектов - закуски, закуски, пьет... или что-либо

foodItem(id, name, desc) - представляет единственный объект - фри, рис, и т.д.

foodItem_group(foodIgem_Id, group_Id) - продукты карт их группе - многие многим

combo(id, name, desc) - описывает комбинацию

combo_group(combo_Id, group_Id) - группы карт к комбинациям - многие многим

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

1
ответ дан 15 December 2019 в 06:35
поделиться

Создайте класс Компонента и подклассы (или объекты) для всех возможных типов Компонентов.

Создайте абстрактный класс Еды и подклассы для всех возможных типов Еды. Еда может проверить, соответствует ли определенный список Компонентов ей (для обнаружения еды из списка компонентов). И Еда может представить клиенту весь выбор компонентов для этой еды.

Я соглашаюсь с Amanda, что Еда должна быть создана из "Слотов". Каждый слот представляет один из выбора Компонента Еды, например, Фри ИЛИ рис ИЛИ клинья. Слот может также смоделировать m-outof-n опцию.

Класс Еды:

class Meal
{
    class MealSlot
    {
        Add(Component);
        bool DoesItMatch(vector<Component> ComponentsVector)
        {
            //Check if this Slot is filled by some element(s)
            // of ComponentsVector 
        }
        PrintSlotOptions();
        vector<Component> Options;

        // for m-of-n option, if multiple items can be chosen in this slot
        int HowManyNeededToFillIt; 
    };

    bool DoesItMatch(vector<Component> ComponentsVector)
    {
        //Check if all Slots are filled by ComponentsVector elements,
        //using Slot::DoesItMatch function
    }
    void PresentChoices()
    {
        for(i=0; i < Slots.size(); i++)
             Slots[i].PrintSlotOptions;
    }
    vector<Slot> Slots;
};

Одна из Конкретной Еды: (Салат ИЛИ рис) И (Чеснок ИЛИ никакой чеснок)

class MealType2 : public Meal
{
    MealType2()
    {
        Slots[0].Add(Salad);
        Slots[0].Add(Rice);
        Slots[1].Add(Garlic);
        Slots[1].Add(NOTHING);
    }    
};

Создайте класс Порядка, который будет содержать имя Еды и список Компонентов. Если Еда заказана, назовите Еду. PresentChoices (). И если список Компонентов дан, пробегитесь через всю Еду и назовите Еду. DoesItMatch.

1
ответ дан 15 December 2019 в 06:35
поделиться

Я предполагаю, что это будет в конечном счете сохранено в базе данных. Я предлагаю составить две таблицы:

  1. Сохранил бы компоненты (фри, салат, чеснок, и т.д.)
  2. Имел бы: id1, id2, отношения. Отношение быть:
    • принадлежит
    • идет с

На основе "принадлежит" отношениям, Вы могли найти, принадлежат ли все компоненты определенной еде. Возможно, затем пойдите и выберите все компоненты, которые принадлежат той еде и предлагают еду, если выбранные компоненты составляют 50% или больше еды.

На основе "идет с" отношениями, Вы могли предложить дополнения еде, или выбранным компонентам.

0
ответ дан 15 December 2019 в 06:35
поделиться

походит на Вас, еда может быть почти любым набором продуктов, поэтому запустите с одного абстрактного базового класса (или интерфейс) для Еды. сделайте много конкретных подклассов, один для каждой еды: кокс, чай, стейк, курица, картофель, рис, паста, суп, салат, и т.д.

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

осуществите рефакторинг свои реальные классы в любую иерархию, в которую они, кажется, хотят войти, поскольку Вы пишете код и тесты.

опрысните в интерфейсах компонента, где они имеют смысл.

0
ответ дан 15 December 2019 в 06:35
поделиться
  1. Кажется, что порядок может состоять или из еды, компонентов или из соединения обоих, таким образом, я сказал бы, имел бы Order класс, который имеет список Components и Meals. Meal должен или разделить на подклассы Component, или они должны реализовать тот же интерфейс.
  2. A Meal состоит из нескольких "слотов", которые могут быть заполнены некоторым набором Components. Meals должен знать, сколько слотов они имеют и что Components может заполнить их.
  3. "Обнаружение a Meal из списка Components" вопрос хитро. Первое, что пришло на ум лучший способ, которым я могу думать, дает каждому Meal метод, который берет список Components и возвращает true если это Meal может быть сделан от них (или возможно подмножество Components, который составил бы это Meal). Order прошел бы список Meals это знает о, и посмотрите, может ли какой-либо из них быть сделан из Components в токе Order. Может быть лучший способ сделать это, все же.

Надеюсь, это поможет!

1
ответ дан 15 December 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: