簡體   English   中英

是否可以避免在多重綁定中使用轉換器

[英]Is it possisble to avoid using converter in multibinding

我遇到了一種情況,我想避免在多綁定中使用轉換器,下面是我當前代碼中的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();
    }
}

在這種情況下,您可以使用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>

您可以使用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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM