[英]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.