【问题标题】:WPF Datagrid - Column Binding related to other columnsWPF Datagrid - 与其他列相关的列绑定
【发布时间】:2014-06-26 01:51:33
【问题描述】:

我有一个包含多个列的 DataGrid。其中一些列类似于

state|Color1|Color2|Color3|...

我想这样做:

If state==1 => RowForeground = Color1
If state==2 => RowForeground = Color2
If state==3 => RowForeground = Color3
...

我能想到的第一个解决方案是使用多个数据触发器:

<DataTrigger Binding="{Binding Path=state}" Value="0">
    <Setter Property="Foreground" Value="{Binding Path=color0, Converter={StaticResource str2clrConverter}}"/>                            
</DataTrigger>

<DataTrigger Binding="{Binding Path=state}" Value="1">
    <Setter Property="Foreground" Value="{Binding Path=color1, Converter={StaticResource str2clrConverter}}"/>                            
</DataTrigger>

<DataTrigger Binding="{Binding Path=state}" Value="2">
    <Setter Property="Foreground" Value="{Binding Path=color2, Converter={StaticResource str2clrConverter}}"/>                            
</DataTrigger>

[...]

有没有更好的解决方案?

【问题讨论】:

    标签: wpf xaml datagrid converter


    【解决方案1】:

    多绑定是一种方式!

    我是如何解决的:

    <Setter Property="Foreground">
        <Setter.Value>
            <MultiBinding Converter="{StaticResource frgConverter}">
                <Binding Path="state"/>
    
                <Binding Path="color1"/>
                <Binding Path="color2"/>
                <Binding Path="color3"/>
            </MultiBinding>
        </Setter.Value>
    </Setter>
    

    还有转换器:

    public class GridForegroundConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            int iColor;
            int nState = System.Convert.ToInt32(values[0]);
    
            if (nState < 0 || nState > 3)
                throw new ArgumentOutOfRangeException("State");
    
            iColor = System.Convert.ToInt32(values[nState + 1]);
    
            byte[] bytes = BitConverter.GetBytes(iColor);
            Color color = Color.FromRgb(bytes[2], bytes[1], bytes[0]);
    
            return new SolidColorBrush(color);
        }
    
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 2011-04-10
      相关资源
      最近更新 更多