有没有办法写这个更短?

时间:2014-01-02 12:34:41

标签: .net wpf

有XAML:

<TextBlock Grid.Row="1" Grid.Column="1" HorizontalAlignment="Center" Text="+1Amf">
    <TextBlock.Style>
        <MultiBinding Converter="{StaticResource ValueToTextBlockStyleConverter}" ConverterParameter="0">
            <Binding Path="ExpertSystemIndexes.C"/>
            <Binding Path="VM.SelectedExperiment.Result2.ExpertSystemIndexes.C"/>
        </MultiBinding>
    </TextBlock.Style>
</TextBlock>

我有50个不同的参数:ExpertSystemIndexes.C,ExpertSystemIndexes.D,ExpertSystemIndexes.E ......

基本上,我需要根据这些和ConverterParameter值将相同的视觉样式应用于不同的文本块。 当然,我可以将此代码复制/粘贴50次。但我希望有更好的方法来做到这一点。

1 个答案:

答案 0 :(得分:1)

如果我没有误解你的问题,你不需要重复这三行代码。要将这三行转换成一行,我们创建一个继承MultiBinding的类

  

继承MultiBinding的类

public class MyMultiBinding : MultiBinding
{
    static IMultiValueConverter converter = new MyConverter();//ValueToTextBlockStyleConverter

    object myConverterParameter;
    public object MyConverterParameter
    {
        set { myConverterParameter = value; this.ConverterParameter = value; }
    }

    string binding1Path;
    public string Binding1Path
    {
        set { binding1Path = value; this.Bindings.Add(new Binding(value)); }
    }

    string binding2Path;
    public string Binding2Path
    {
        set { binding2Path = value; this.Bindings.Add(new Binding(value)); }
    }

    public MyMultiBinding()
    {
        this.Converter = converter;
    }
}
  

现在让我们在xaml中使用这个类

<TextBox>
        <TextBox.Text>
            <local:MyMultiBinding Binding1Path="Text1" Binding2Path="Text2" MyConverterParameter="0"/>
        </TextBox.Text>
    </TextBox>
  

转换器

public class MyConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string myValue = string.Empty;
        foreach (var item in values)
        {
            if (item != null)
                myValue += item.ToString();
        }
        return myValue;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

这与您的代码不完全相同。我在这里尝试的只是让你知道如何将这三行转换成一行。我希望这会有所帮助。