2016-12-16 95 views
0

我需要将两个值(可能情况下命名为单位和数量)作为转换器参数传递给绑定转换器(请注意,我不需要将这些值作为绑定值多重绑定),我需要将它们作为绑定转换器参数传递,因为我需要转换器的ConvertConvertBack方法)。 我认为这样做的唯一方法是创建一个新类UnitQuantityBindClass将它们设置在该类中,并将此类作为转换器参数传递,但此类不会获得绑定值,当我通过转换器时,转换器参数是创建的类,不具有值。 能帮我一个吗?传递多个绑定值作为绑定转换器参数

public class UnitQuantityBindClass:DependencyObject 
{ 
    public static readonly DependencyProperty QuantityProperty = DependencyProperty.Register(
     "Quantity", typeof(EQuantities), typeof(UnitQuantityBindClass)); 

    public EQuantities Quantity 
    { 
     get { return (EQuantities)GetValue(QuantityProperty); } 
     set { SetValue(QuantityProperty, value); } 
    } 

    public static readonly DependencyProperty UnitProperty = DependencyProperty.Register(
     "Unit", typeof(Enum), typeof(UnitQuantityBindClass)); 

    public Enum Unit 
    { 
     get { return (Enum)GetValue(UnitProperty); } 
     set { SetValue(UnitProperty, value); } 
    } 
} 

用法:

<textboxunitconvertor:TextBoxUnitConvertor Name="gasDensityValueControl" InstantaneousConvert="True" Margin="96,163,0,0" IsEnabled="{Binding ElementName=chkGas,Path=IsChecked}" QuantityBind="{Binding _FluidBlackOilClass.SGGas_SC.Quantity , RelativeSource={RelativeSource AncestorType=Window}, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Width="206" Height="28" HorizontalAlignment="Left" VerticalAlignment="Top"> 
    <textboxunitconvertor:TextBoxUnitConvertor.TextBoxText> 
     <Binding Path="_FluidBlackOilClass.SGGas_SC.Value" RelativeSource="{RelativeSource AncestorType=Window}" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay" Converter="{StaticResource ValueStorageForUnitConverter}"> 
      <Binding.ConverterParameter> 
       <classes:UnitQuantityBindClass 
        Quantity="{Binding ElementName=gasDensityValueControl, 
           Converter={StaticResource DummyConverter}, 
           Path=_Quantity, 
           UpdateSourceTrigger=PropertyChanged, 
           Mode=TwoWay, 
           PresentationTraceSources.TraceLevel=High}" 
        Unit="{Binding ElementName=gasDensityValueControl, 
          Path=_CurrentUnitEnum, 
          UpdateSourceTrigger=PropertyChanged, 
          Mode=TwoWay}" /> 
      </Binding.ConverterParameter> 
     </Binding> 
    </textboxunitconvertor:TextBoxUnitConvertor.TextBoxText> 
</textboxunitconvertor:TextBoxUnitConvertor> 

注:我的要求是获得“_FluidBlackOilClass.SGGas_SC.Value”,并把它传递到转换器,也是我需要通过“_Quantity”和“_CurrentUnitEnum”为转换器参数根据“_Quantity”和“_CurrentUnitEnum”将“_FluidBlackOilClass.SGGas_SC.Value”转换为新值并将其设置为TextBoxText。还需要根据“_Quantity”和“_CurrentUnitEnum”将TextBoxText转换回“_FluidBlackOilClass.SGGas_SC.Value”中。

+0

在输出窗口任何约束力的错误? – WPFUser

+0

为什么将数量和单位绑定声明为TwoWay?这似乎没有道理。你确定'_Quantity'和'_CurrentUnitEnum'是TextBoxUnitConvertor类的公共属性吗?下划线看起来很奇怪。 – Clemens

+0

除此之外,真的很难理解这一切应该做什么。你可能会试着解释你实际想要达到的目标。也许我们可以提供更简单的解决方案。 – Clemens

回答

1
  1. 让你的转换器继承Freezable,并引入DP称为SourceTextBox将获得关于你TextBox,然后在ConvertConvertBack方法,您可以使用此引用来得到所需的性能。

    public class BindableConverter : Freezable, IValueConverter 
    { 
        #region Overrides of Freezable  
        protected override Freezable CreateInstanceCore() 
        { 
         return new BindableConverter(); 
        }  
        #endregion  
    
        public TextBox SourceTextBox 
        { 
         get { return (TextBox)GetValue(SourceTextBoxProperty); } 
         set { SetValue(SourceTextBoxProperty, value); } 
        } 
    
        // Using a DependencyProperty as the backing store for SourceTextBox. This enables animation, styling, binding, etc... 
        public static readonly DependencyProperty SourceTextBoxProperty = 
         DependencyProperty.Register("SourceTextBox", typeof(TextBox), typeof(BindableConverter), new PropertyMetadata(null)); 
    
    
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
        { 
         // ... do something with SourceTextBox here 
        } 
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
        { 
         // ... do something 
        } 
    } 
    
  2. 用法:

    <textboxunitconvertor:TextBoxUnitConvertor Name="gasDensityValueControl" ... > 
        <textboxunitconvertor:TextBoxUnitConvertor.Resources> 
         <local:BindableConverter x:Key="ValueStorageForUnitConverter" SourceTextBox="{Binding ElementName=gasDensityValueControl}"/> 
        </textboxunitconvertor:TextBoxUnitConvertor.Resources> 
        ... 
    </textboxunitconvertor:TextBoxUnitConvertor>