wpf - 是否可以将 WPF Combobox.SelectedValue 绑定(bind)到多个 ObjectDataProvider?

标签 wpf wcf data-binding objectdataprovider

尝试确定是否可以使用 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/

相关文章:

wpf - 如果用户登录成功,那么我想显示主窗口,如果没有,我想退出应用程序

.net - Silverlight、EDM/LINQ 和 WCF Web 服务 - 如何将集合传递给 Silverlight

wcf - 部署 WCF - 需要在 SSL 站点上设置主机 header

c# - 如何为控件的嵌套属性创建数据绑定(bind)?

wpf - XAML 中的 Source 与 DataContext

c# - 如何在 WPF(MVVM/ Entity Framework )中更新表单时显示从数据库到 TextBlock 的外键数据值?

.net - 使用样式将控件包裹在边框中而不覆盖默认外观

c# - DataGrid 列标题与数据不对齐

c# - WCF 错误 - 找不到引用契约(Contract) 'UserService.UserService' 的默认终结点元素

c# - 如何在代码中为 TreeView 设置 WPF 数据模板?