2013-07-27 5 views
0

У меня есть два текстовых поля для ввода с десятичной запятой. Сумма значений в текстовых блоках должна быть равна десятичному значению свойства формы.Два текстовых поля, сумма которых является взаимодополняющей

Я пытался использовать два MultiBindings с MultiValueConverter так:

XAML:

<TextBox x:Name="textBox1" ...> 
     <TextBox.Text> 
      <MultiBinding Converter="{StaticResource complementaryConverter}" Mode="OneWay"> 
       <Binding ElementName="textBox2" Path="Text" /> 
       <Binding Path="TotalValue" /> 

      </MultiBinding> 
     </TextBox.Text> 
    </TextBox> 
    <TextBox x:Name="textBox2" ...> 
     <TextBox.Text> 
      <MultiBinding Converter="{StaticResource complementaryConverter}" Mode="OneWay"> 
       <Binding ElementName="textBox1" Path="Text" /> 
       <Binding Path="TotalValue" /> 
      </MultiBinding> 
     </TextBox.Text> 
    </TextBox> 

где TotalValue это свойство является формой, а преобразователь complementaryConverter является:

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 

     decimal result = (decimal)values[1] - (decimal)values[0]; 
     return result.ToString(); 
    } 

Это не работает, потому что я должен сначала установить одно из текстовых полей, равное общему значению, а другое - нулю. В идеале я хотел бы, чтобы конвертер делал дополнительную сумму и значения текстовых полей, привязанных к двум десятичным свойствам формы. Я попробовал много возможностей, но я застрял в этой глупой проблеме пару дней, поэтому любая помощь будет заметна.

+0

Почему вы используете 'Mode = "OneWay"'? Это означает, что значение может быть изменено только из кода и ** не ** пользовательского интерфейса. – ChrisF

+0

Oneway фактически выполняет задание, когда я привязываю только одно текстовое поле к другому. Использование режима = «TwoWay» вызывало вызов ConvertBack, но ConvertBack получает один объект в качестве параметра и возвращает объект [], поэтому я не смог его правильно реализовать, чтобы преобразовать обратно. –

ответ

0

Я думаю, вы выбрали неправильный подход, привязав TextBoxes напрямую друг к другу. Вместо этого вы должны разоблачить два свойства зависимостей на вашей модели viewmodel (или Form, как вы говорите), по одному для каждого окна. Вы можете привязываться к тем, которые находятся в XAML, и в сеттерах для этих свойств включают логику изменения значения другой.

Вот черновик для одного из свойств:

public static readonly DependencyProperty Text1Property = 
     DependencyProperty.Register("Text1", typeof(decimal), typeof(Form), 
            new PropertyMetadata(default(decimal))); 

    public decimal Text1 
    { 
     get { return (decimal)GetValue(Text1Property); } 
     set 
     { 
      SetValue(Text1Property, value); 
      SetValue(Text2Property, TotalValue - value); 
     } 
    } 
+0

Спасибо, Роб, ваше решение работает хорошо. Текстовые поля не обновляются при изменении свойств, но я над этим работаю. –