/ / WPF / XAML - сравнете "SelectedIndex" на две комбинирани кутии (DataTrigger?) - wpf, xaml, свързване, datatrigger

WPF / XAML - сравнете "SelectedIndex" на два комбайни (DataTrigger?) - wpf, xaml, свързване, datatrigger

"Имам две комбинирани кутии с едно и също съдържание. Потребителят не трябва да има право да избира един и същ елемент два пъти. следователно съдържанието на комбинациите" (= selectedindex?) никога не трябва да е равно.

първият ми опит беше да сравня избрания индекс с преобразувател на данни за показване / скриване на бутон:

<DataTrigger Binding="{Binding ElementName=comboBox1, Path=SelectedIndex}" Value="{Binding ElementName=comboBox2, Path=SelectedIndex}">
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>

изглежда, че не е възможно да се използва Value = {Binding}. има ли друг начин (ако е възможно, без да използвате конвертор)? Благодаря предварително!

Отговори:

3 за отговор № 1

Опция 1

Бихте могли да използвате ValidationRules - може и да бъденаправено в XAML и ще работи за еднократна ситуация. Той би бил изключително локализиран и не е нещо, което бих препоръчал, тъй като правилото няма да бъде използвано повторно. Може би някой друг може да излезе с общо правило, което да обхваща различни входове. Опитайте това.

<ComboBox>
<ComboBox.SelectedValue>
<Binding Path="Whatever" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:ComparisonValidationRule />
</Binding.ValidationRules>
</Binding>
</ComboBox.SelectedValue>
</ComboBox>

И може би ComparingRule изглежда така и трябва да бъде в кода зад това правило, за да видите контролите във визуалното дърво.

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

Използвайте тригер и конвертор. Наистина не е твърде трудно. Ето как бих го направил.

<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();
}
}

0 за отговор № 2

Ако ComboBoxes споделят един и същ източник на данни, задайте флаг на основния обект на данни, когато елемент е избран чрез първия ComboBox.

В шаблона с данни за обекта с данни, показан във втория комбиниран прозорец, напишете тригер на данни, който се свързва към това свойство и прави нещо подходящо.

Уверете се, че обвързването ви е TwoWay за първия ComboBox.