访问IvalueConverter中的用户控件属性银光4

时间:2011-10-09 02:52:51

标签: silverlight xaml ivalueconverter

我正在尝试编写一个代表水箱的自定义silverlight控件。它有两个依赖属性,liquidLevel和liquidCapacity,我想将这两个参数与gradientBrush一起传递给转换器。这个想法是转换器将根据液位和容量进行计算,并调整刷子上的梯度停止,使液体上升和下降的外观。

我的坦克有一个“窗口”,它只是一个矩形和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的依赖属性,并在最终的viewmodel中执行此计算,但是数据的组织方式我很确定我会有一个全新的如果我试试这个挑战。对我来说,能够对xaml中的liquidcapacity进行硬编码,并将liquidlevel绑定到viewmodel似乎更易于管理。视图模型将从数据库中拉出一堆值并进入一个可观察的字典,其中一个是液体级别,因此我认为将liquidlevel直接绑定到可观察字典会更容易,而不是尝试转换它在绑定之前视图模型中的“fillpercentage”。

另外我很顽固,为了我的教育,有人知道我建议做的事情是否可行。如果是这样,那么正确的方法是什么呢?

1 个答案:

答案 0 :(得分:0)

当你说你

  

尝试将liquidCapacity作为转换器参数传递

我怀疑你正在尝试做类似

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

这不起作用。你不能在另一个绑定中绑定。

就个人而言,我不会将转换器用于您想要做的事情。相反,我将添加一个方法来将LinearGradientBrush的渐变停止调整为LiquidTank控件的代码。然后,我将PropertyChangedCallback添加到LiquidLevel控件的LiquidCapacityLiquidTank依赖项属性中,并在这些回调中调用此方法。