Xamarin Forms: как динамически установить ширину двух столбцов в сетке с помощью mvvm

Технически это неправильная практика для вызова конструкторов или деструкторов явно.

Ключевое слово delete в конечном итоге вызывает их при его использовании. То же самое касается новых конструкторов.

Извините, но этот код заставляет меня хотеть вырвать мои волосы. Вы должны делать это следующим образом:

Выделить новый экземпляр объекта

AnObject* anObject = new AnObject();

Удалить экземпляр объекта

delete anObject;

НИКОГДА не делать это:

anObject->~AnObject(); // My step 1.
free(anObject)

Если вы должны «сбросить» объект, либо создайте метод, который очищает все переменные экземпляра внутри, или то, что я бы рекомендовал вам сделать, это удалить объект и выделить себе новый .

«Это ядро ​​языка?»

Это ничего не значит. Perl имеет около шести способов записи цикла for. Просто потому, что вы можете делать что-то на языке, потому что они поддерживаются, значит, вы должны их использовать. Черт, я мог бы написать весь мой код, используя для операторов switch, потому что «Core» языка поддерживает их. Не делает это хорошей идеей.

Почему вы используете malloc, когда вам явно не нужно. Malloc - это метод С.

Новые и Удалить ваши друзья в C ++

«Сброс» объекта

myObject.Reset();

Там вы идете. Таким образом, вы избавляетесь от ненужного выделения и освобождения памяти опасным образом. Напишите метод Reset (), чтобы очистить значение всех объектов внутри вашего класса.

0
задан pinedax 17 January 2019 в 05:00
поделиться

2 ответа

Ваша проблема - это объект, который вы пытаетесь связать. Вам нужно использовать GridLength

Например

GridLength test =  new GridLength(3, GridUnitType.Star); // which is "3*"

Просто обновите вашу ViewModel, чтобы получить значение типа GridLength

0
ответ дан Bruno Caceiro 17 January 2019 в 05:00
поделиться

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

Чтобы исправить это, одним из решений будет использование Converter, которое преобразует ваш тип (тот, который идет из ViewModel) в тип, ожидаемый для ширины сетки. Подробнее о конвертерах здесь

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

public class IntToGridLengthConverter : IValueConverter
{
    public IntToGridLengthConverter()
    {
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var intValue = System.Convert.ToInt32(value);
        return new GridLength(intValue, GridUnitType.Star);
    }

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

Тогда в XAML вам просто нужно его использовать.

Добавление нового раздела в XAML и вызов конвертера

<ContentPage.Resources>
    <ResourceDictionary>
        <local:IntToGridLengthConverter x:Key="gridLengthConverter" />
    </ResourceDictionary>
</ContentPage.Resources>

Затем использование конвертера в ваших привязках

<Grid.ColumnDefinitions>
    <ColumnDefinition Width="{Binding firstColValue, Converter={StaticResource gridLengthConverter}}" />            
    <ColumnDefinition Width="{Binding secondColValue, Converter={StaticResource gridLengthConverter}}"/>            
</Grid.ColumnDefinitions>

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

Одним небольшим изменением, которое вам нужно сделать в свойствах ViewModel, является то, что теперь они должны иметь тип int (целое число). Таким образом, в вашей ViewModel вы должны установить только целую часть значения, которое вы хотите установить, например:

firstColValue = 7; 
secondColValue = 3;

Работа по преобразованию этих значений в 7* и 3* соответственно будет отвечать за Преобразователь .

Использование конвертеров не позволит вам использовать элементы Xamarin.Forms в ваших моделях представления, так как они должны быть независимыми. Также этот конвертер можно повторно использовать на любой другой странице, которая вам нужна.

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

0
ответ дан pinedax 17 January 2019 в 05:00
поделиться
Другие вопросы по тегам:

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