2013-07-27 18 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> 

,其中總價值是形式的財產,而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

?這意味着該值只能從代碼和**而不是UI中更改。 – ChrisF

+0

Oneway實際上只是在將一個文本框綁定到另一個文本框時纔開始工作。使用Mode =「TwoWay」導致ConvertBack被調用,但ConvertBack接收一個對象作爲參數並返回object [],所以我無法正確實現它來轉換回來。 –

回答

0

我想你已經選擇了錯誤的方法,通過直接綁定文本框到對方。相反,你應該在你的視圖模型(或者你所說的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

感謝羅布,你的解決方案運作良好。當屬性更改時,文本框不會更新,但我正在處理它。 –

相關問題