Доступ к свойствам пользовательского элемента управления в IvalueConverter | Silverlight 4 - PullRequest
0 голосов
/ 09 октября 2011

Я пытаюсь написать пользовательский элемент управления Silverlight, который представляет резервуар для воды. У него есть два свойства зависимостей, liquidLevel и liquidCapacity, и я хочу передать оба этих параметра в конвертер вместе с GradientBrush. Идея заключается в том, что преобразователь будет выполнять расчет на основе уровня жидкости и емкости и регулировать градиентные упоры на щетке, чтобы создать видимость подъема и опускания жидкости.

у моего танка есть "окно", которое представляет собой просто прямоугольник и градиентный куст, пока у меня есть это

Мой шаблон управления

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MoreControls;assembly=MoreControls"
    xmlns:assets="clr-namespace:MoreControls.Assets">

   <LinearGradientBrush x:Name="LiquidLevelTankWindow" StartPoint="0.469,0.997" EndPoint="0.487,0.013">
        <GradientStop Color="#FF1010F1" Offset="0.0"/>
        <GradientStop Color="#FF5555FB" Offset="0.55"/>
        <GradientStop Color="#FFE4E4F1" Offset="0.6"/>
         <GradientStop Color="#FFFAFAFD" Offset="1"/>
   </LinearGradientBrush>  

   <assets:LiquidLevelBrushConverter x:Name="LiquidLevelBrushConverter" levelBrush="{StaticResource LiquidLevelTankWindow}"/>

    <Style x:Key="Liquid" TargetType="local:LiquidTank">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:LiquidTank">

                // * parts of the control here *

                // the part of the control im interested in
                <Rectangle x:Name="TankWindow" Width="32.3827" Height="64" Canvas.Left="27" Canvas.Top="42" Stretch="Fill" StrokeLineJoin="Round" Stroke="#FF000310" 
                                    Fill="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=LiquidLevel, Converter={StaticResource LiquidLevelBrushConverter}}" />

               // * rest of control template *

Использование элемента управления в xaml (в конце концов я хочу связать эти свойства)

     <local:LiquidTank Style="{StaticResource Liquid}" LiquidCapacity="100" LiquidLevel="50"/>

и преобразователь

   public class LiquidLevelBrushConverter : IValueConverter
    {
        public LinearGradientBrush levelBrush { get; set; }  

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
        //I can access the liquid level parameter here           
            double level = 0;
            double.TryParse(value.ToString(), out level);

            GradientStopCollection gsc = levelBrush.GradientStops;
            //some logic to alter gradient stops   

            return null;
        }

Теперь я хочу получить доступ ко второму управляющему свойству liquidCapacity из моего конвертера, чтобы я мог рассчитать процент заполнения бака. Я попытался передать liquidCapacity в качестве параметра конвертера, но если это возможно, я не могу понять синтаксис (я довольно новичок в Silverlight).

Теперь, когда я зашел так далеко, я думаю, что мог бы создать одно свойство зависимости, называемое fillpercentage, и выполнить этот расчет в возможной модели представления, но с учетом того, как будут организованы данные, я почти уверен, что у меня будет совершенно новый множество проблем, если я попробую это. Мне кажется более управляемым, чтобы иметь возможность жестко кодировать емкость жидкости в xaml и связывать уровень жидкости с моделью представления. Модель представления будет вытягивать кучу значений из базы данных в наблюдаемый словарь, одним из которых является уровень ликвидности, поэтому я думаю, что было бы намного проще связать уровень жидкости непосредственно с наблюдаемым словарем, чем пытаться преобразовать его до «fillpercentage» в модели представления перед его привязкой.

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

1 Ответ

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

Когда вы говорите, что

пытались передать liquidCapacity в качестве параметра преобразователя

Я подозреваю, что вы пытаетесь сделать что-то вроде

<Rectangle Fill="{Binding Path=LiquidLevel, ConverterParameter={Binding Path=LiquidCapacity} ...}" />

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

Лично я бы не использовал конвертер для того, что вы пытаетесь сделать.Вместо этого я бы добавил метод для настройки градиентных остановок LinearGradientBrush для кода элемента управления LiquidTank.Затем я добавил бы PropertyChangedCallback s к свойствам зависимостей LiquidLevel и LiquidCapacity элемента управления LiquidTank и вызвал бы этот метод из этих обратных вызовов.

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