尝试确定是否可以使用 XAMAL 绑定(bind)将 ComboBox 的 SelectedValue 绑定(bind)到多个 ObjectDataProvider 的输入。
我查看了 MultiBinding,但它似乎将多个控件组合在一起,这并不完全是我今天想要的。
我希望能够让 ComboBox(位置)更改它所做的 TextBlock(偏差),并调用 ObjectDataProvider (CommentProvider) 来更新 TextBox (locationComments)。
这在代码隐藏中相当简单,但我宁愿不走这条路作为学习经验。
XAMAL代码
<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" />
最佳答案
使用多重绑定(bind),您的方向是正确的。 关键是将 MultiValueCoverter 与 MultiBinding 结合使用。
<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>
之前我们只绑定(bind)到一件事,现在我们将它绑定(bind)到两个 ObjectDataProvider。让我们做到这一点的关键因素是转换器:
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 中的不同位置。
使用此转换器,我们还可以尝试使用两个文本框来尝试一个小示例:
<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 更改时,它将更新两个 TextBox。
关于wpf - 是否可以将 WPF Combobox.SelectedValue 绑定(bind)到多个 ObjectDataProvider?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/848946/