是否可以避免在多重绑定中使用转换器

时间:2014-01-08 08:54:43

标签: c# wpf xaml

我遇到了一种情况,我想避免在多重绑定中使用转换器,下面是我当前代码中的xaml源代码段。 下面的代码工作得很好,但是有可能避免转换器第一位吗?

视图模型:

public MainViewModel()
{
    Cars = new List<string>() { "Audi", "BMW", "Ferrari", "Ford" };
    Models = new List<string>() { "Model 1", "Model 2" };
    IsOptionEnable = false;
}

public bool IsOptionEnable { get; private set; }
public List<string> Models { get; private set; }

public List<string> Cars { get; private set; }

主窗口xaml:

<Grid>
    <ComboBox HorizontalAlignment="Left" VerticalAlignment="Top" Width="120" Margin="87.2,44.8,0,0" 
              ItemsSource="{Binding Cars}" 
              SelectedItem="{Binding SelectedItm}"
              Style="{StaticResource ModelsComboBox}">
    </ComboBox>
</Grid>

资源字典:

<Style x:Key="ModelsComboBox" TargetType="ComboBox">
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="ComboBoxItem">
                <Setter Property="IsEnabled">
                    <Setter.Value>
                        <MultiBinding Converter="{StaticResource ModelToBoolConverter}">
                            <Binding/>
                            <Binding Path="DataContext.IsOptionEnable" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}"/>
                        </MultiBinding>
                    </Setter.Value>
                </Setter>
            </Style>
        </Setter.Value>
    </Setter>
</Style>

多值转换器:

internal sealed class ModelToBoolConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        bool enable = true;
        if ((values[0] != null && values[0] != DependencyProperty.UnsetValue) &&
            (values[1] != null && values[1] != DependencyProperty.UnsetValue))
        {
            var comboboxItemText = values[0] as string;
            if ((comboboxItemText == "Ferrari") && (bool)values[1] == false)
            {
                enable = false;
            }
        }

        return enable;
    }

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

2 个答案:

答案 0 :(得分:2)

在这种情况下,您可以使用MultiDataTrigger

           <Style TargetType="ComboBox">
                <Setter Property="IsEnabled" Value="True" />
                <Style.Triggers>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding}" Value="Ferrai"/>
                            <Condition Binding="{Binding Path=DataContext.IsOptionEnable, RelativeSource={RelativeSource AncestorType=ComboBox}}" Value="False" />
                        </MultiDataTrigger.Conditions>
                        <MultiDataTrigger.Setters>
                            <Setter Property="IsEnabled" Value="False" />
                        </MultiDataTrigger.Setters>
                    </MultiDataTrigger>
                </Style.Triggers>
            </Style>

答案 1 :(得分:0)

您可以使用 MultiDataTrigger 来实现相同目标。

资源字典:

  <Style x:Key="ModelsComboBox" TargetType="ComboBox">
            <Setter Property="ItemContainerStyle">
                <Setter.Value>
                    <Style TargetType="ComboBoxItem">
                        <Setter Property="IsEnabled" Value="True"/>
                        <Style.Triggers>
                            <MultiDataTrigger>
                                <MultiDataTrigger.Conditions>
                                    <Condition Binding="{Binding}" Value="Ferrari"/>
                                    <Condition Binding="{Binding Path=DataContext.IsOptionEnable,
                                               RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}}"
                                               Value="False"/>
                                </MultiDataTrigger.Conditions>
                                <Setter Property="IsEnabled" Value="False"/>
                            </MultiDataTrigger>
                        </Style.Triggers>
                    </Style>
                </Setter.Value>
            </Setter>
        </Style>