2009-05-11 6 views
2

versucht zu bestimmen, ob es möglich ist, die SelectedValue eines ComboBox an die Eingänge der mehreren ObjectDataProviders mit XAMAL Bindungen zu binden.Ist es möglich, WPF Combobox.SelectedValue an mehrere ObjectDataProvider zu binden?

ich sah Multibinding, aber das scheint mehrere Steuerelemente zusammen zu gruppieren, nicht genau, was zu Tag ich suche.

Ich möchte in der Lage sein, die ComboBox (Standorte) ändern Sie den TextBlock (Deviance), was es tut und den ObjectDataProvider (CommentProvider), um die TextBox (locationComments) zu aktualisieren.

Dies ist recht einfach in einem Code-behind würde aber lieber nicht diesen Weg als eine Lernerfahrung gehen.

XAMAL CODE

<Window.Resources> 
    <ObjectDataProvider x:Key="LocationProvider" 
     ObjectType="{x:Type srv:ServiceClient}" 
     IsAsynchronous="True"MethodName="GetAssignedLocations" /> 
    <ObjectDataProvider 
     x:Key="DevianceProvider" 
     ObjectType="{x:Type srv:ServiceClient}" 
     IsAsynchronous="True" MethodName="GetPercentChange"> 
     <ObjectDataProvider.MethodParameters> 
      <system:String>Location1</system:String> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 
    <ObjectDataProvider 
     x:Key="CommentProvider" 
     ObjectType="{x:Type srv:ServiceClient}" 
     IsAsynchronous="True" 
     MethodName="GetCommentByBusinessUnit"> 
     <ObjectDataProvider.MethodParameters> 
      <system:String>Location1</system:String> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 
</Window.Resources> 

<ComboBox Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="locations" VerticalAlignment="Top" ItemsSource="{Binding Source={StaticResource LocationProvider}}" 
       DisplayMemberPath="BuName" SelectedValuePath="BuKey" 
       SelectionChanged="locations_SelectionChanged"> 
     <ComboBox.SelectedValue> 
      <Binding Source="{StaticResource DevianceProvider}" 
      Path="MethodParameters[0]" 
       BindsDirectlyToSource="True" 
       Mode="OneWayToSource" /> 
     </ComboBox.SelectedValue> 
<TextBlock Name="deviance" Height="23" Margin="0,0,645,17" Width="40" Text="{Binding Source={StaticResource DevianceProvider}}" IsEnabled="False" /> 

<TextBox Height="23" Margin="0,0,181,17" Name="locationComments" Width="350" /> 

Antwort

3

Sie mit dem Multibinding auf dem richtigen Weg sind. Der Schlüssel ist, einen MultiValueCoverter in Verbindung mit dem MultiBinding zu verwenden.

<MultiBinding Converter="{StaticResource Coverter_LocationMultiConverter}" 
       Mode="OneWayToSource"> 
       <Binding Source="{StaticResource DevianceProvider}" 
         Path="MethodParameters[0]" 
         BindsDirectlyToSource="True" 
         Mode="OneWayToSource" /> 
       <Binding Source="{StaticResource CommentProvider}" 
         Path="MethodParameters[0]" 
         BindsDirectlyToSource="True" 
         Mode="OneWayToSource" /> 
      </MultiBinding> 

Wo wir vorher nur an eine Sache gebunden haben, binden wir sie nun an beide ObjectDataProvider. Der entscheidende Faktor, den wir dies tun können ist der Konverter:

public class LocationMultiCoverter : IMultiValueConverter 
{ 
    #region IMultiValueConverter Members 

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return new object[] { value, value }; 
    } 

    #endregion 
} 

Weil wir nur den gleichen Wert an beiden Orten die CovertBack Methode brauchen ganz einfach ist, aber sicher, dass ich Sie können sehen, dass es verwendet werden könnte, um Analysieren Sie komplexe Komponenten und geben Sie verschiedene Komponenten an verschiedene Stellen in der Benutzeroberfläche zurück.

mit diesem Konverter können wir auch eine kleine Probe ausprobieren, zwei Textfelder statt:

<Window x:Class="Sample.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:Sample" 
    Title="Window1" 
    Height="300" 
    Width="300"> 
<Window.Resources> 
    <local:LocationMultiCoverter x:Key="Coverter_LocationMultiConverter" /> 
</Window.Resources> 
<Grid> 
    <StackPanel> 
     <TextBlock x:Name="uiDeviance" /> 
     <TextBlock x:Name="uiComment" /> 
     <ComboBox x:Name="uiLocations" 
        Height="23" 
        HorizontalAlignment="Left" 
        VerticalAlignment="Top" 
        SelectedValuePath="Content"> 
      <ComboBoxItem>1</ComboBoxItem> 
      <ComboBoxItem>2</ComboBoxItem> 
      <ComboBoxItem>3</ComboBoxItem> 
      <ComboBoxItem>4</ComboBoxItem> 
      <ComboBoxItem>5</ComboBoxItem> 
      <ComboBox.SelectedValue> 
       <MultiBinding Converter="{StaticResource Coverter_LocationMultiConverter}" 
           Mode="OneWayToSource"> 
        <Binding ElementName="uiDeviance" 
          Path="Text" 
          BindsDirectlyToSource="True" /> 
        <Binding ElementName="uiComment" 
          Path="Text" 
          BindsDirectlyToSource="True" /> 
       </MultiBinding> 
      </ComboBox.SelectedValue> 
     </ComboBox> 
    </StackPanel> 
</Grid> 

(Der Konverter in meinem Beispiel gibt es in dem Code des Fensters hinter als separate Klasse) Und wie Sie dies testen können, wird es beide TextBoxen aktualisieren, wenn sich der SelectedValue ändert.

+0

Es scheint, dass mit dem Konverter und mehrbindigen die objectdataproviders feuern nicht, wenn der gewählte Wert geändert wird. Der Breakpoint innerhalb von ConvertBack wird getroffen, aber die Breakpoints in meinem WCF-Dienst werden nicht getroffen. – Brian

+0

Ich habe mein Problem erkannt. Wenn Sie das Quell-Tag nicht richtig angeben, funktioniert es nicht. Stell dir das vor. Source = „{Static CommentProvider}“ – Brian

+0

Das erste, was in den Sinn kommt, ist, dass die Typen übereinstimmen müssen. Auch wenn Sie in WPF ziemlich viele Werte in ein beliebiges Feld einfügen können, wird bei einigen Dingen wie den Methodenparametern oder der neuen StringFormat-Bindungseigenschaft der Typ erkannt. Also, wenn Ihr BuKey nicht auch ein String ist, der Probleme verursachen könnte. Jenseits dieser möglichen Ursache, sollte es funktionieren und WCF kann der Blocker hier sein. Ein schneller Weg, um dies zu lösen, wäre, die Objektdatenanbieter zu entfernen und im ConvertBack die Methodenaufrufe durchzuführen, die Sie benötigen. Dann in den Bindungen an die benötigten Elemente binden. – rmoore