【问题标题】:XAML Binding: Combobox populating textbox in one scenario, but not another? WPFXAML 绑定:组合框在一种情况下填充文本框,但不是在另一种情况下? WPF
【发布时间】:2015-08-31 20:45:54
【问题描述】:

我有一组代码可以正常工作。它将“地址”字段从包含诸如 [ID、Fname、Lname、地址、zip 等] 的用户记录数据库加载到 ComboBox 的选择集中。一旦用户选择了一个地址,它也会在相应的文本框中显示该选择。

工作代码:

<Window x:Class="CC_Ticketing_WPF.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:CC_Ticketing_WPF"
    mc:Ignorable="d"
    Title="MainWindow" Height="800" Width="600">
    <Window.Resources>
        <DataTemplate x:Key="orderheaderTemplate">
            <StackPanel>
                <TextBlock Text="{Binding XPath=address}"/>
            </StackPanel>
        </DataTemplate>
    </Window.Resources>
    <StackPanel>
        <!-- I think this what you said populated properly in the comments -->
        <ComboBox x:Name="cb_Address" DataContext="{StaticResource orderheaderDataSource}" ItemsSource="{Binding XPath=/dataroot/orderheader}" DisplayMemberPath="address" HorizontalAlignment="Left" VerticalAlignment="Top" Width="90" IsEditable="True"/>
        <!-- this should replicate what you see in the combobox -->
        <TextBlock x:Name="tb_Address" Text="{Binding ElementName=cb_Address,Path=Text}"/>
    </StackPanel>
</Window>

问题是我知道这是非常有限的,因为它依赖于定义堆栈面板中的所有内容。我正在按照这些思路尝试这个东西:

破码

<Window x:Class="CC_Ticketing_WPF.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:CC_Ticketing_WPF"
    mc:Ignorable="d"
    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    Title="MainWindow" Height="800" Width="600">
    <Window.Resources>
        <DataTemplate x:Key="orderheaderTemplate">
        </DataTemplate>
    </Window.Resources>
    <StackPanel>
        <ComboBox x:Name="cb_Address" DataContext="{StaticResource orderheaderDataSource}" ItemsSource="{Binding XPath=/dataroot/orderheader}" DisplayMemberPath="address" SelectedValuePath="Content" HorizontalAlignment="Left" VerticalAlignment="Top" Width="90" IsEditable="True"/>
        <TextBlock x:Name="tb_Address" Text="{Binding ElementName=cb_Address,Path=SelectedValue,Mode=OneWay}"/>
    </StackPanel>
</Window>

这会加载地址并允许在组合框中进行选择,但不会向文本框发送任何内容。最终,我希望从此组合框中选择一个地址,不仅将选择发送到文本框,而且还将该记录中的其他相关数据发送到其他文本框(就像您只选择一个地址并填充一堆文本框一样地址、姓名、邮编等)非常常见的业务需求。有人可以让我在正确的轨道上完成此任务吗?

【问题讨论】:

    标签: wpf database xaml binding combobox


    【解决方案1】:

    这是我做的,它有效。

    <Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    
    <Grid>
        <StackPanel>
            <ComboBox x:Name="cb_Address" DisplayMemberPath="address" SelectedValuePath="content" HorizontalAlignment="Left" VerticalAlignment="Top" Width="90" IsEditable="True"/>
            <TextBlock x:Name="tb_Address" Text="{Binding SelectedValue, ElementName=cb_Address, Mode=OneWay}"/>
        </StackPanel>
    
    </Grid>
    

    后面的代码来测试它

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public ObservableCollection<OrderHeader> Data = new ObservableCollection<OrderHeader>();
    
        public MainWindow()
        {
            InitializeComponent();
    
    
            for (int i = 0; i <= 100; i++)
            {
                Data.Add(new OrderHeader { address = "Address_" + i.ToString(), content = "Content_"+i.ToString() });
            }
    
            cb_Address.ItemsSource = Data;
        }
    
        public class OrderHeader
        {
            public string address {  get; set;}
            public string content { get; set; }
        }
    }
    

    【讨论】:

    • 嗯,从头开始向我抛出异常:找不到类型或命名空间名称“ObservableCollection”(您是否缺少 using 指令或程序集引用?)
    • 添加“使用 System.Collections.ObjectModel;”
    • 阅读它看起来我可能缺少程序集参考?我很新,可以被它抛出,但我现在正在研究如何引用它。
    • ;) 没问题。我们都走了那条路。
    • 啊,明白了,这确实有效!我能否要求对组合框选择的外观进行额外编辑以填充第二个组合框和文本框(例如:组合框 1 保存名字,组合框 2 保存姓氏。当您选择名字时,它不仅会填充它的名字文本框,但另外用正确的姓氏填充组合框 2 和文本框 2)。如果那太多了,不用担心,无论如何我都会将其标记为已解决。非常感谢伊斯梅尔!
    【解决方案2】:

    将文本框上的路径更改为 SelectedValue 而不是 SelectedItem.Content

    【讨论】:

    • 否定,仍然不发送。
    • 等等,我在这里试试。请1分钟。
    • 你有我可以粘贴的示例数据吗?
    • 不是很遗憾,我所有的数据都在一个大的 xml 文件中,并且是真实的用户数据。 (我还更新了我的工作代码和损坏的代码,由于某种原因它没有列出一些声明)
    • 如果我只是将 Path=SelectedValue 更改为 Path=Text,损坏的代码似乎可以工作,但我不明白为什么 SelectedValue 或 SelectedItem.Content 会破坏它
    【解决方案3】:

    您可以,只需将下面的代码与右侧的组合框绑定即可。

    <TextBlock x:Name="tb_Address">
                <Run Text="{Binding SelectedValue, ElementName=cb_Firstnames, Mode=OneWay}" />
                <Run Text=" " />
                <Run Text="{Binding SelectedValue, ElementName=cb_Lastnames, Mode=OneWay}" />
            </TextBlock>
    

    【讨论】:

      猜你喜欢
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-28
      • 2013-07-25
      • 2018-09-15
      • 2019-12-12
      相关资源
      最近更新 更多