我有两个具有相同内容的组合框。不应允许用户两次选择相同的项目。因此,组合框的内容(= selectedindex?)永远不应该相等。
我的第一次尝试是使用数据触发器对selectedindex进行comap以显示/隐藏按钮:
<DataTrigger Binding="{Binding ElementName=comboBox1, Path=SelectedIndex}" Value="{Binding ElementName=comboBox2, Path=SelectedIndex}">
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>
似乎无法使用Value = {Binding}。有没有其他方法(如果可能,不使用转换器)?提前谢谢!
答案 0 :(得分:3)
选项1
您可以使用ValidationRules - 它也可以在XAML中完成,并且可以用于一次性情况。它会非常本地化,而不是我推荐的东西,因为规则不可重复使用。也许其他人可以提出一个包含不同输入的通用规则。试试这个。
<ComboBox>
<ComboBox.SelectedValue>
<Binding Path="Whatever" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:ComparisonValidationRule />
</Binding.ValidationRules>
</Binding>
</ComboBox.SelectedValue>
</ComboBox>
也许ComparisonRule看起来像这样,并且必须在该规则的代码隐藏中才能看到可视树中的控件。
public class ComparisonValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
if (this.firstComboBox.SelectedIndex == this.secondComboBox.SelectedIndex)
return new ValidationResult(false, "These two comboboxes must supply different values.");
else return new ValidationResult(true, null);
}
}
或如果你想在错误模板之外设置一些有趣的东西,你绝对可以使用触发器。
选项2
使用触发器&amp;转换器。这真的不太难。我就是这样做的。
<Style x:Key="{x:Type ComboBox}" TargetType="{x:Type ComboBox}">
<Style.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource EqualsConverter}">
<Binding ElementName="cbOne" Path="SelectedIndex"/>
<Binding ElementName="cbTwo" Path="SelectedIndex"/>
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Background" Value="Yellow"/>
</DataTrigger>
</Style.Triggers>
</Style>
和代码隐藏中的转换器
public class EqualsConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType,
object parameter, CultureInfo culture)
{
if (values[0] is int && values[1] is int && values[0] == values[1])
return true;
return false;
}
public object[] ConvertBack(object value, Type[] targetTypes,
object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
答案 1 :(得分:0)
如果ComboBox共享相同的itemsource,则在通过第一个ComboBox选择项目时在基础数据对象上设置一个标志。
在第二个组合框中显示的数据对象的datatemplate中,写一个绑定到该属性并执行适当操作的数据触发器。
确保第一个ComboBox的绑定是TwoWay。