Я разрабатываю приложение с C # и WPF, у меня есть собственный настраиваемый элемент управления слайдером. и текстовые поля в одном окне. Все свойства моего ползунка DependencyProperty
.
Я использую текстовые поля для изменения свойств ползунка. Я хочу использовать ValidationRule
в текстовых полях. Я написал свой собственный ValidationRule (производный от класса ValidationRule). Я хочу передать некоторые параметры этому ValidationRule
. Вот код:
Текстовое окно:
<TextBox HorizontalAlignment="Left" Height="24" Margin="10,169,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="40" Style="{DynamicResource archiveSearchTextBox}" MaxLength="3" HorizontalContentAlignment="Center" TabIndex="2">
<TextBox.Text>
<Binding UpdateSourceTrigger="PropertyChanged" Mode="TwoWay" ElementName="gammaSlider" Path="LeftThumbValue" NotifyOnValidationError="True" ValidatesOnExceptions="True" ValidatesOnDataErrors="True">
<Binding.ValidationRules>
<ExceptionValidationRule/>
<local:ZeroTo255MinMax>
<local:ZeroTo255MinMax.Parameters>
<local:ValidationParameters NumberCombineTo="{Binding ElementName=gammaSlider, Path=RightThumbValue}" ValTypeFor0to255="ShouldBeSmaller"/>
</local:ZeroTo255MinMax.Parameters>
</local:ZeroTo255MinMax>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
ZeroTo255MinMax Правило проверки:
public class ZeroTo255MinMax : ValidationRule
{
private ValidationParameters _parameters = new ValidationParameters();
public ValidationParameters Parameters
{
get { return _parameters; }
set { _parameters = value; }
}
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
string numberStr = value as string;
int val;
if (int.TryParse(numberStr, out val))
{
if (val < 0 || val > 255)
return new ValidationResult(false, "");
else if (Parameters.ValTypeFor0to255 == ValidationParameters.ValTypes.ShouldBeBigger)
{
if (val <= Parameters.NumberCombineTo || val - Parameters.NumberCombineTo < 2)
return new ValidationResult(false, "");
}
else if (Parameters.ValTypeFor0to255 == ValidationParameters.ValTypes.ShouldBeSmaller)
{
if (val >= Parameters.NumberCombineTo || Parameters.NumberCombineTo - val < 2)
return new ValidationResult(false, "");
}
return new ValidationResult(true, "");
}
else
return new ValidationResult(false, "");
}
}
public class ValidationParameters : DependencyObject
{
public enum ValTypes { ShouldBeSmaller, ShouldBeBigger };
public static readonly DependencyProperty NumberCombineToProperty = DependencyProperty.Register("NumberCombineTo", typeof(int), typeof(ValidationParameters), new PropertyMetadata(0, new PropertyChangedCallback(OnNumberCombineToChanged)));
public static readonly DependencyProperty ValTypeFor0to255Property = DependencyProperty.Register("ValTypeFor0to255", typeof(ValTypes), typeof(ValidationParameters), new PropertyMetadata(ValTypes.ShouldBeBigger));
private static void OnNumberCombineToChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { d.CoerceValue(NumberCombineToProperty); }
public int NumberCombineTo
{
get { return (int)GetValue(NumberCombineToProperty); }
set { SetValue(NumberCombineToProperty, value); }
}
public ValTypes ValTypeFor0to255
{
get { return (ValTypes)GetValue(ValTypeFor0to255Property); }
set { SetValue(ValTypeFor0to255Property, value); }
}
}
Я предполагаю, что все в порядке, но проблема в том, что параметр NumberCombineTo
установлен на default (0)
даже если я изменю свойство RightThumbValue gammaSlider. Мне нужно обновить свойство NumberCombineTo
при изменении RightThumbValue
.
RightThumbValue
работает вне сценарияValidationRule
? Код, который вы разместили, кажется мне приемлемым, но это мало что говорит; Я пробую множество вещей в WPF, которые вроде бы должны работать, но не работают. :) - person Peter Duniho   schedule 21.02.2015RightThumbValue
меняется так, как должно быть. Я думаю, что часть проверки binding неверна. Потому чтоNumberCombineTo
НЕ меняется. Он имеет значение по умолчаниюDependencyProperty's
, даже еслиRightThumbValue
изменилось. - person cKNet   schedule 22.02.2015ElementName
для привязокLeftThumbValue
иRightThumbValue
. Конечно, если у вас на самом деле есть два разных ползунка с двумя большими пальцами, это может быть хорошо; но если вы ожидаете, что оба будут связаны с одним и тем же ползунком, использование двух разных имен, вероятно, будет неправильным (т. е. используйтеgammaSlider
илиmyOwnSlider
, но не оба). - person Peter Duniho   schedule 22.02.2015