/ / WPF / XAML - compara o “SelectedIndex” de duas caixas de combinação (DataTrigger?) - wpf, xaml, binding, datatrigger

WPF / XAML - compara o “SelectedIndex” de duas caixas de combinação (DataTrigger?) - wpf, xaml, binding, datatrigger

Eu tenho duas caixas de combinação com o mesmo conteúdo. O usuário não deve ter permissão para escolher o mesmo item duas vezes. Portanto, o conteúdo da caixa de combinação (= índice selecionado?) nunca deve ser igual.

minha primeira tentativa foi comapare o selectedindex com um datatrigger para mostrar / ocultar um botão:

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

parece que não é possível usar Value = {Binding}. existe alguma outra maneira (se possível sem usar um conversor)? desde já, obrigado!

Respostas:

3 para resposta № 1

Opção 1

Você poderia usar o ValidationRules - ele também pode serfeito em XAML e funcionará para uma situação única. Seria extremamente localizado e não é algo que eu recomendaria, pois a regra não seria reutilizável. Talvez outra pessoa possa criar uma regra genérica para abranger diferentes insumos. Tente isso.

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

E talvez o ComparisonRule se pareça com isso, e ele teria que estar no code-behind dessa regra para ver os controles na árvore visual.

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

OU Você poderia definitivamente fazê-lo com um gatilho se você quisesse definir algumas coisas interessantes fora de um modelo de erro.

opção 2

Use um gatilho e conversor. Não é realmente muito difícil. Aqui está como eu faria isso.

<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>

e o conversor em code-behind

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 para resposta № 2

Se as caixas de combinação compartilharem a mesma fonte de itens, defina um sinalizador no objeto de dados subjacente quando um item é selecionado por meio da primeira caixa de combinação.

No datatemplate para o objeto de dados exibido na segunda caixa de combinação, escreva um datatrigger que se liga a essa propriedade e faça algo apropriado.

Certifique-se de que sua ligação seja TwoWay para a primeira ComboBox.