2009-05-11 10 views
2

XAMALバインディングを使用して複数のObjectDataProvidersの入力にComboBoxのSelectedValueをバインドできるかどうかを確認しようとしています。WPF Combobox.SelectedValueを複数のObjectDataProvidersにバインドすることはできますか?

私はMultiBindingを見ましたが、それは複数のコントロールをまとめてグループ化しているように見えます。

私はComboBox(位置)でTextBlock(deviance)を変更し、TextBox(locationComments)を更新するためにObjectDataProvider(CommentProvider)を呼び出すことができます。

これはコードビハインドではかなり簡単ですが、学習の経験としてこのルートを使用しないことをお勧めします。あなたはMultiBindingので正しい軌道に乗っている

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" /> 

答えて

3

。 キーは、MultiBindingと組み合わせてMultiValueCoverterを使用することです。

<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> 

ここでは、以前は1つのものにバインドしていましたが、ここでは両方のObjectDataProvidersにバインドしています。私たちはこれを行うことができます重要な要因は、コンバータです:

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 
} 

私達はちょうどしかし、私はあなたがそれをするために使用することができることを見ることができると確信してい、CovertBack方法は非常に簡単です、両方の場所で同じ値を必要とするのでいくつかの複雑なものを解析し、異なるコンポーネントをUIの別の場所に渡します。このコンバータを使用して

我々はまた、代わりに2つのテキストボックスを使用して、小さなサンプルを試してみることができます:

<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> 

(私の例ではコンバータは、別のクラスのように後ろのウィンドウのコードに存在します) これをテストするとわかるように、SelectedValueが変更されたときに両方のテキストボックスが更新されます。

+0

コンバータとマルチバインディングでは、選択された値が変更されたときにオブジェクトのデータプロバイダが起動しないようです。 ConvertBack内のブレークポイントがヒットしていますが、WCFサービスのブレークポイントがヒットしていません。 – Brian

+0

ソースタグを正しく指定しなかった場合、問題は解決しました。想像してみろ。 Source = "{StaticResource CommentProvider}" – Brian

+0

最初に気になるのは、タイプが一致する必要があることです。たとえWPFの何かのフィールドにかなりの価値を詰め込むことはできますが、メソッドパラメータや新しいStringFormatバインディングプロパティのようなものは型を認識しています。したがって、あなたのBuKeyが問題を引き起こしている可能性のある文字列でない場合。 考えられる原因を超えて、動作していてWCFがここでブロックしている可能性があります。これを解決する簡単な方法は、オブジェクトデータプロバイダを削除し、ConvertBackで必要なメソッド呼び出しを行うことです。次に、バインディングで必要な要素にバインドします。 – rmoore

関連する問題