それは、複数のObjectDataProvidersにWPF Combobox.SelectedValueをバインドすることは可能ですか?
-
21-08-2019 - |
質問
がXAMALバインディングと複数ObjectDataProvidersの入力にコンボボックスのSelectedValueのを結合することが可能であるかどうかを決定しようとします。
私はMultiBindingのを見たが、それは私が一日に探していない、まさに、一緒に複数のコントロールをグループ化しているように見える。
私はそれがないのTextBlock(逸脱)を変更し、テキストボックス(locationComments)を更新したObjectDataProvider(CommentProvider)を呼び出すようにコンボボックス(場所)を持ってできるようにしたいと思います。
これはコードビハインドで非常に簡単ですが、学習体験としてこのルートを行かないことを好むだろう。
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" />
解決
あなたはMultiBindingので正しい軌道に乗っています。 キーは、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>
どこに我々は今、我々は両方の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>
(私の例のコンバータは、別個のクラスとしての後ろにウィンドウのコードに存在します) そして、あなたは、このうちのテストを見ることができるように、それは両方のTextBoxを更新する際にSelectedValueのが変化します。