2016-05-08 3 views
1

Basierend auf this previously answered question versuche ich ein IMultiValueConverter zu erstellen, das die Text-Eigenschaft eines TextBox in WPF an die Summe mehrerer anderer TextBox-Werte gebunden wird. Ich habe die Antwort auf die referenzierte Frage ziemlich genau gespiegelt, aber beim Testen bekomme ich eine InvalidCastException. Im folgenden Code sind die auskommentierten Zeilen der Code aus der oben genannten Antwort. Ich habe versucht, dies mit dem var-Datentyp anstelle von double (ich mag nicht var, nur eine Präferenz), und erhielt die gleichen Fehler an der gleichen Stelle. Ich habe versucht, den Stil der Besetzung auf verschiedene Arten zu ändern, einschließlich Convert.ToInt32, (int) und sogar int.Parse, aber alles ergibt den gleichen Fehler, gleichen Ort.Verwenden von MultiBinding zum Berechnen der Summe mehrerer Textfelder

Hat jemand eine Ahnung, was das Problem damit sein könnte? Dies ist mein erster richtiger Ausflug in wie diese Bindung, so könnte es sein, ich bin es grundsätzlich Missverständnis, aber ehrlich gesagt nicht glaube, dass das, was es ist ...

public class AddListRecordsConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     double result = 0.0; 

     try 
     { 
      double[] doubleValues = values.Cast<double>().ToArray(); 

      foreach (var doubleValue in doubleValues) 
      { 
       result += doubleValue; 
      } 

      //var doubleValues = values.Cast<double>().ToArray(); 
      //var leftPart = string.Join(" x ", doubleValues); 
      //var rightPart = doubleValues.Sum().ToString(); 
      //var result = string.Format("{0} = {1}", leftPart, rightPart); 
      //return result; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 

     return result; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Destination TextBox:

<TextBox x:Name="allRecords" Style="{StaticResource dataEntryTextBox}" Grid.Column="1" Grid.Row="6"> 
         <TextBox.Text> 
          <MultiBinding Converter="{StaticResource AddListRecordsConverter}"> 
           <Binding ElementName="allRecordsOne" Path="Text"></Binding> 
           <Binding ElementName="allRecordsTwo" Path="Text"></Binding> 
          </MultiBinding> 
         </TextBox.Text> 
        </TextBox> 

Quelle Textfelder:

<TextBox x:Name="allRecordsOne" Style="{StaticResource dataEntryTextBox}" Grid.Column="0" Grid.Row="4" GotFocus="SelectAllOnFocus_GotFocus" LostFocus="allRecords_LostFocus" /> 
<TextBox x:Name="allRecordsTwo" Style="{StaticResource readOnlyTextBox}" Grid.Column="0" Grid.Row="5" Text="{Binding ElementName=allRecordsOne, Path=Text}" GotFocus="SelectAllOnFocus_GotFocus" LostFocus="allRecords_LostFocus" /> 
<TextBox x:Name="allRecordsThree" Style="{StaticResource readOnlyTextBox}" Grid.Column="0" Grid.Row="6" Text="{Binding ElementName=allRecordsOne, Path=Text}" GotFocus="SelectAllOnFocus_GotFocus" LostFocus="allRecords_LostFocus" /> 
+0

Ich dachte, dass, solange die Logik unspezifisch war, es technisch MVVM bleiben würde. Zugegeben, ich bin nicht sehr klar auf MVVM, aber da dies generische ist würde es nicht immer noch qualifizieren? Wenn ich zum Beispiel einen Verweis auf allRecords.Text in der Converter-Methode verwenden würde, könnte ich es als Verstoß gegen MVVM sehen, aber da dieser Konverter von jeder beliebigen Textbox verwendet werden kann, sollte es trotzdem funktionieren? –

+0

Nun, ich bin mir nicht sicher, aber ich denke nicht. Der Grund für die Summierung (eigentlich Subtraktion jetzt, aber dasselbe Konzept) ist, dass es eine Zahl gibt, die sich jeden Tag erhöht. Es gibt 3 Teile der Gesamtzeit, die aufgezeichnet werden müssen. Dies geschieht, indem der Wert um 10 Uhr von dem Wert um 12 Uhr abgezogen wird. Das System wird sich nie ändern, aber wenn es zu etwas anderem außer einer Textbox geändert wird, müsste die Bindung nur zu dem neuen Steuerelement verschoben werden. Ich könnte nur den MVVM-Teil davon vermissen, ich verstehe nicht, wie MVVM sehr gut funktioniert, und habe noch keine gute Erklärung gefunden, um es zu verstehen :) –

Antwort

2

vereinfacht ich dein Beispiel. Beachten Sie, dass ich Mode="OneWay" verwendet habe, um eine Ausnahme in der ConvertBack-Methode zu vermeiden.

<StackPanel> 
    <TextBox x:Name="allRecords"> 
     <TextBox.Text> 
      <MultiBinding Converter="{StaticResource AddListRecordsConverter}"> 
       <Binding ElementName="allRecordsOne" Path="Text" Mode="OneWay"/> 
       <Binding ElementName="allRecordsTwo" Path="Text" Mode="OneWay"/> 
      </MultiBinding> 
     </TextBox.Text> 
    </TextBox> 

    <TextBox x:Name="allRecordsOne" /> 
    <TextBox x:Name="allRecordsTwo" /> 
</StackPanel> 

das Problem mit dem Konverter ist, dass es zwei leere Zeichenfolge (Standardwert Text) als Eingang (values) empfängt und sie nicht richtig verarbeiten kann. es muss defensiver sein

Verwandte Themen