Привязать текст выпадающего списка к правилу проверки внутри другого выпадающего списка?

#c# #wpf #xaml #mvvm #binding

Вопрос:

Я хотел бы привязать текст из комбинированного блока CB1 к Правилу проверки (режиму связи) в комбинированном блоке CB2. Мой исходный код выглядит так, но я получаю ошибку: «Привязка» может быть установлена только для «свойства зависимостей» «объекта зависимости». Есть ли способ решить эту проблему?

     public string CommunicationMode { get; set; }
    
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        return new ValidationResult(true, null);
    }


<ComboBox Name="CB1">
    <ComboBox.Text>
        <Binding Path="CB1" UpdateSourceTrigger="PropertyChanged"/>
    </ComboBox.Text>
 </ComboBox>

<ComboBox Name="CB2">
    <ComboBox.Text>
        <Binding Path="CB2" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <valid:ComboboxValidationRule CommunicationMode="{Binding ElementName=CB1, Path=Name}" ValidatesOnTargetUpdated="True"/>
            </Binding.ValidationRules>
        </Binding>
    </ComboBox.Text>
 </ComboBox>
 

Комментарии:

1. В {Binding ElementName=CB1, Path=Name} , разве привязка не должна быть включена Text вместо Name ?

Ответ №1:

Вы можете создать Wrapper класс со свойством зависимости:

 public class ComboboxValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        //your validation logic...
        return new ValidationResult(true, null);
    }

    public Wrapper Wrapper { get; set; }
}

public class Wrapper : DependencyObject
{
    public static readonly DependencyProperty CommunicationModeProperty =
         DependencyProperty.Register(nameof(CommunicationMode), typeof(string), typeof(Wrapper));

    public string CommunicationMode
    {
        get { return (string)GetValue(CommunicationModeProperty); }
        set { SetValue(CommunicationModeProperty, value); }
    }
}
 

XAML:

 <ComboBox Name="CB2">
    <ComboBox.Text>
        <Binding Path="CB2" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <valid:ComboboxValidationRule ValidatesOnTargetUpdated="True">
                    <valid:ComboboxValidationRule.Wrapper>
                        <valid:Wrapper CommunicationMode="{Binding Source={x:Reference CB1}, Path=Name}" />
                    </valid:ComboboxValidationRule.Wrapper>
                </valid:ComboboxValidationRule>
            </Binding.ValidationRules>
        </Binding>
    </ComboBox.Text>
</ComboBox>
 

Комментарии:

1. @patrickgc: Ты пробовал это? Пожалуйста, не забудьте принять ответ, если ваша первоначальная проблема была решена.