【问题标题】:Accessing ComboBox inside a Datatemplate of a listbox from c# code behind in metro application?从 Metro 应用程序中的 c# 代码访问列表框的 Datatemplate 内的 ComboBox?
【发布时间】:2012-09-11 12:47:02
【问题描述】:

我在列表框内有一个组合框,列表框有一个数据模板,该组合框和其他元素驻留在其中。

<ListBox x:Name="lstbxbProducts" HorizontalAlignment="Left" Height="547" Margin="0,221,0,0" VerticalAlignment="Top" Width="1044" RenderTransformOrigin="0.600000023841858,0.5">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <StackPanel Width="80" Orientation="Horizontal">
                           <TextBlock Text="{Binding prdnum}" VerticalAlignment="Center" HorizontalAlignment="Left" ></TextBlock>     
                           <TextBlock Text="  -" VerticalAlignment="Center" HorizontalAlignment="Left" ></TextBlock>
                        </StackPanel>
                        <StackPanel Width="400">
                            <TextBlock Text="{Binding prddsc}" VerticalAlignment="Center"  HorizontalAlignment="Left" ></TextBlock>
                        </StackPanel>   
                       <StackPanel Width="300">
                            <ComboBox Name="cmbbxbUMselec" ItemsSource="{Binding}" Width="200" FontSize="24"  VerticalAlignment="Center" HorizontalAlignment="Center" ></ComboBox>
                        </StackPanel>
                        <StackPanel Width="180">
                            <TextBlock Text="{Binding prcby_prc}" VerticalAlignment="Center" HorizontalAlignment="Center" ></TextBlock>
                        </StackPanel>
                       <StackPanel Width="100">
                            <TextBox Text="{Binding stdordqty, Mode=TwoWay}" VerticalAlignment="Center" TextAlignment="Center"                      HorizontalAlignment="Right" ></TextBox>
                        </StackPanel>

                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

我的疑问是我无法访问列表框的数据模板中存在的组合框, 我想从 c# 代码隐藏将列表绑定到组合框

cmbbxbUMselec.DataContext = lstumcods;

以这种方式从后面的代码中获取,但我无法访问列表框的数据模板中存在的组合框

请告诉我如何解决这个问题。

提前致谢

【问题讨论】:

  • 您是否有理由要从代码隐藏设置组合框?您会接受在 XAML 中涉及不同绑定的解决方案吗?

标签: silverlight xaml microsoft-metro winrt-xaml


【解决方案1】:

试试这个:

首先我已将您的列表框更改为:

<ListBox x:Name="lstbxbProducts" HorizontalAlignment="Left" Height="547" Margin="0,221,0,0" VerticalAlignment="Top" Width="1044" RenderTransformOrigin="0.600000023841858,0.5">
        <ListBox.Resources>
            <ComboBox x:Key="myComboBox" Name="cmbbxbUMselec" ></ComboBox>
        </ListBox.Resources>           
       <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <StackPanel Width="80" Orientation="Horizontal">
                       <TextBlock Text="{Binding prdnum}" VerticalAlignment="Center" HorizontalAlignment="Left" ></TextBlock>     
                       <TextBlock Text="  -" VerticalAlignment="Center" HorizontalAlignment="Left" ></TextBlock>
                    </StackPanel>
                    <StackPanel Width="400">
                        <TextBlock Text="{Binding prddsc}" VerticalAlignment="Center"  HorizontalAlignment="Left" ></TextBlock>
                    </StackPanel>   
                   <StackPanel Width="300">
                        <ComboBox Name="cmbbxbUMselec" ItemsSource="{Binding Source={StaticResource myComboBox}, Path=ItemsSource, Mode=TwoWay}"
                                    Width="200" FontSize="24"  VerticalAlignment="Center" HorizontalAlignment="Center" ></ComboBox>
                    </StackPanel>
                    <StackPanel Width="180">
                        <TextBlock Text="{Binding prcby_prc}" VerticalAlignment="Center" HorizontalAlignment="Center" ></TextBlock>
                    </StackPanel>
                   <StackPanel Width="100">
                        <TextBox Text="{Binding stdordqty, Mode=TwoWay}" VerticalAlignment="Center" TextAlignment="Center"                      HorizontalAlignment="Right" ></TextBox>
                    </StackPanel>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

请注意,我在您的 listbox.resources 中添加了一个项目。

在代码隐藏中,我添加了以下代码:

            var cb = lstbxbProducts.Resources.FirstOrDefault(c => c.Key.ToString() == "myComboBox");
        ((ComboBox)cb.Value).ItemsSource = new List<string> { "A", "B", "C" };

不要忘记将“System.Linq”添加到您的程序集中,否则它将无法正常工作。 现在用你的“真实”来源试一试,告诉我们它是否有效。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    如果您不介意在 XAML 中而不是在代码隐藏中执行此操作,这里有一个想法。

    我假设您的 ListBox 是在 UserControl 内的某个地方定义的,如下所示:

    <UserControl x:Name="MyUserControl">
        <!-- Other elements here -->
        <ListBox x:Name="lstbxbProducts">
            <ListBox.ItemTemplate>
                <!-- etc... -->
            </ListBox.ItemTemplate>
        </ListBox>
    </UserControl>
    

    如果 lstumcods 是在 UserControl 的代码隐藏中定义的公共属性,那么您可以试试这个:

    <ComboBox ItemsSource="{Binding lstumcods, ElementName=MyUserControl" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多