Текстовое поле внутри выбранного элемента списка. Как изменить содержимое текстового поля? - PullRequest
1 голос
/ 28 ноября 2011

У меня есть список для инвентаря.Когда я выбираю элемент, он показывает пару элементов управления для редактирования объема или количества элементов.вот так:

<StackPanel HorizontalAlignment="Right" Orientation="Horizontal" >
    <Label Content="Edit Volume:"/>
    <Button Click="bPlus_Click2" Content="+" Height="29" Margin="10,0,0,0" Name="bPlus" Width="29" />
    <TextBox FontSize="16" Height="29" HorizontalContentAlignment="Center" IsReadOnly="True" Name="tNum2" Text="0" VerticalContentAlignment="Center" Width="44" />
    <Button Click="bMinus_Click2" Content="-" Height="29" Name="bMinus" Width="29" />
    <Button Content="OK!"/>
    <StackPanel.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}}}" Value="False">
                    <Setter Property="StackPanel.Visibility" Value="Collapsed"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </StackPanel.Style>
</StackPanel>

Теперь мне нужны кнопки ПЛЮС и МИНУС для редактирования содержимого текстового поля ... как я могу это сделать ??

Я НАШЕЛ ПУТЬ !!Это то, что у меня есть:

<Window.Resources>
    <DataTemplate x:Key="dtInventory">
        <Border Name="itemBorder" BorderBrush="#FFEBE476" BorderThickness="2" Padding="10" Margin="2" Background="#FF5AB11D">
            <StackPanel x:Name="sp1">
                <StackPanel Orientation="Horizontal" x:Name="spsp1">
                    <StackPanel Width="60">
                        <TextBlock Text="DME Item: "/>
                    </StackPanel>
                    <StackPanel Width="205" x:Name="spsp2">
                        <TextBlock Text="{Binding Path=Name}"/>
                    </StackPanel>
                    <StackPanel Width="60" x:Name="spsp3">
                        <TextBlock Text="Volume: "/>
                    </StackPanel>
                    <StackPanel Width="30" x:Name="spsp4">
                        <TextBlock Text="{Binding Path=Volume}"/>
                    </StackPanel>
                </StackPanel>
                <StackPanel x:Name="sp2" HorizontalAlignment="Right" Orientation="Horizontal" >
                    <Label Content="Edit Volume:" x:Name="l1"/>
                    <myext:IntegerUpDown x:Name="udVolume" Minimum="0" DefaultValue="0"/>
                    <Button Content="OK!" x:Name="bOk" Click="bOk_Click" />
                    <StackPanel.Style>
                        <Style>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}}}" Value="False">
                                    <Setter Property="StackPanel.Visibility" Value="Collapsed"></Setter>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </StackPanel.Style>
                </StackPanel>
            </StackPanel>
        </Border>
    </DataTemplate>
</Window.Resources>

Затем список:

<ListBox Height="399" HorizontalAlignment="Left" Margin="462,61,0,0" Name="lInventory" VerticalAlignment="Top" Width="390" ItemsSource="{Binding}" ItemTemplate="{StaticResource dtInventory}">

И .cs:

ListBoxItem selecteditem = lInventory.ItemContainerGenerator.ContainerFromIndex(int.Parse(lInventory.SelectedIndex.ToString())) as ListBoxItem;
        if (selecteditem != null)
        {
            try
            {
                DataTemplate dt = selecteditem.ContentTemplate;
                Border border = VisualTreeHelper.GetChild(selecteditem, 0) as Border;
                ContentPresenter cp = border.Child as ContentPresenter;
                StackPanel sp = dt.FindName("sp1", cp) as StackPanel;
                IntegerUpDown updown = sp.FindName("udVolume") as IntegerUpDown;

                if (updown.Value != 0)
                {
                    Inventory.DMEItems dme = new Inventory.DMEItems();
                    dme.Volume = int.Parse(updown.Value.ToString());
                    dme.DMEInventoryItemID = int.Parse(lInventory.SelectedValue.ToString());
                    dme.UpdateItem();
                    UpdateInventory();
                }
            }
            catch (Exception ex)
            { System.Windows.MessageBox.Show("ERROR: " + ex.Message, "Edit Volume" ,MessageBoxButton.OK, MessageBoxImage.Error); }
        }

Я надеюсь, что это работает для других людей!

1 Ответ

0 голосов
/ 28 ноября 2011

К сожалению, вы не можете делать математические операции в xaml из коробки. Но вы можете использовать числовой элемент управления UpDown (например, из расширенного набора инструментов WPF)

Или вы создаете свой собственный UserControl, в котором у вас есть две кнопки и текстовое поле, а также функции для обратного отсчета. Затем используйте этот элемент управления в вашей разметке, например.

<StackPanel HorizontalAlignment="Right" Orientation="Horizontal" >
                            <Label Content="Edit Volume:"/>
<local:MyNumericUpDownControl/>

EDIT:

Вот ссылка о том, как создать собственный числовой элемент управления внизу

...