Выбор Объекта Текстового поля в Поле списка не изменяет выбранный пункт поля списка

У вас явно неверные данные. Вы можете найти его, выполнив что-то вроде этого:

select packslip
from [A1Warehouse].[dbo].[RF_LOG2]
where try_cast(l2.PACKSLIP as decimal(22,8)) is null and l2.PACKSLIP is not null;

Что касается вашего запроса, вы можете избежать ошибки, используя try_cast(). Тем не менее, вы должны увидеть реальные проблемы в ваших данных.

И ваши отношения внешнего ключа должны иметь совпадающие типы и быть должным образом объявлены.

45
задан Arcturus 11 January 2019 в 06:33
поделиться

8 ответов

Я не совсем уверен, что Вы хотели бы установить выбор непосредственно, как описано в предыдущем ответе, потому что я думаю, что он повредил бы мультивыбор и некоторые другие сценарии

. Вы могли бы хотеть попытаться модернизировать кнопку как ниже и видеть то, что происходит.

<Button ClickMode="Pressed" Focusable="False">
<Button.Template>
    <ControlTemplate>  // change the template to get rid of all the default chrome 
        <Border Background="Transparent"> // Button won't be clickable without some kind of background set
            <ContentPresenter />
        </Border>
    </ControlTemplate>
</Button.Template>
<TextBox />

0
ответ дан Steven 26 November 2019 в 21:08
поделиться

Поле списка обрабатывает выбор объекта, но не знает о фокусе текстового поля, встроенного в. Если Вы хотите изменить выбор каждый раз, когда текстовое поле получает фокус ввода тогда, необходимо изменить выбор поля списка вручную, afaik.

0
ответ дан Joey 26 November 2019 в 21:08
поделиться

там некоторое свойство, которое я должен установить, чтобы Текстовое поле передало событие щелчка к Полю списка?

Это не простое свойство, но можно обработать GotFocus событие на Вашем TextBox, затем использовать VisualTreeHelper, чтобы найти ListBoxItem и выбрать его:

private void TextBox_GotFocus(object sender, RoutedEventArgs e)
{
    TextBox myTextBox = sender as TextBox;
    DependencyObject parent = VisualTreeHelper.GetParent(myTextBox);
    while (!(parent is ListBoxItem))
    {
        parent = VisualTreeHelper.GetParent(parent);
    }
    ListBoxItem myListBoxItem = parent as ListBoxItem;
    myListBoxItem.IsSelected = true;
}
2
ответ дан Robert Macnee 26 November 2019 в 21:08
поделиться

Ваш не очень конкретный относительно Вашей начальной ситуации. Но я предполагаю, что Вы используете DataBinding и ItemTemplate. Это - по моему скромному мнению, простой способ сделать это, также если Ваш новичок по этой теме. Это должно работать:

<ListBox ItemsSource="{Binding someDataCollection}" Name="myListBox">
   <ListBox.ItemTemplate>
      <DataTemplate>
         <TextBox Text="{Binding datafield}" Tag="{Binding .}"
                  GotFocus="TextBox_GotFocus"/>
      </DataTemplate>
   </ListBox.ItemTemplate>
</ListBox>

private void TextBox_GotFocus(object sender, RoutedEventArgs e)
{
   myListBox.SelectedItem = (sender as TextBox).Tag; /* Maybe you need to cast to the type of the objects contained in the collection(bound as ItemSource above) */
}
0
ответ дан Marcel B 26 November 2019 в 21:08
поделиться

Самым простым путем я смог найти, чтобы сделать, это должно использовать событие PreviewMouseDown и установить свойство IsSelected шаблонного родителя. Начиная с пузыря событий предварительного просмотра вниз, ListBoxItem обработает событие, как только пользователь нажимает текстовое поле, поле комбинированного списка или любое другое управление, Вы устанавливаете событие на.

Одна хорошая вещь об этом состоит в том, что можно использовать то же событие для всех типов средств управления, так как они все происходят из элемента Платформы. Кроме того, установка IsSelected (вместо того, чтобы установить SelectedItem) заставит несколько объектов быть выбранными при установке SelectionMode поля списка к "Расширенному" который мог или не мог быть тем, что Вы ищете.

т.е.:

код c#

private void Element_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    ((sender as FrameworkElement).TemplatedParent as ListBoxItem).IsSelected = true;
}

xaml

    ...
    <ComboBox PreviewMouseDown="Element_PreviewMouseDown"/>
    <TextBox PreviewMouseDown="Element_PreviewMouseDown"/>
    ...
1
ответ дан Mark Synowiec 26 November 2019 в 21:08
поделиться

Приложенное поведение на основе Ответ Арктура , чтобы сделать это reuseable и иметь его не скрытый в коде позади.

Создают файл с приложенным поведением (= присоединенное свойство)

public static class SelectListBoxItemWhenControlInsideTheItemIsClickedBehavior
{
    public static readonly DependencyProperty EnableProperty = DependencyProperty.RegisterAttached(
        "Enable",
        typeof(bool),
        typeof(SelectListBoxItemWhenControlInsideTheItemIsClickedBehavior),
        new FrameworkPropertyMetadata(false, OnEnableChanged));


    public static bool GetEnable(FrameworkElement frameworkElement)
    {
        return (bool)frameworkElement.GetValue(EnableProperty);
    }


    public static void SetEnable(FrameworkElement frameworkElement, bool value)
    {
        frameworkElement.SetValue(EnableProperty, value);
    }


    private static void OnEnableChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if ( d is ListBoxItem listBoxItem)
            listBoxItem.PreviewGotKeyboardFocus += ListBoxItem_PreviewGotKeyboardFocus;
    }

    private static void ListBoxItem_PreviewGotKeyboardFocus(object sender, System.Windows.Input.KeyboardFocusChangedEventArgs e)
    {
        var listBoxItem = (ListBoxItem)sender;
        listBoxItem.IsSelected = true;
    }
}

, Добавляет это к ресурсам Вашей симпатии.

, Например <Windows.Resources>

<Window.Resources>
    <Style TargetType="ListViewItem">
        <Setter Property="myBehavior:SelectListBoxItemWhenControlInsideTheItemIsClickedBehavior.Enable" Value="true"/>
    </Style>
</Window.Resources>

Добавляют пространство имен

, если Visual Studio не достаточно умна для добавления его автоматически. например, когда Ваш проект называют "MyApp", и Вы сохранили файл в папке "MyBehaviors", Пространство имен будет находиться под Окном:

<Window
    xmlns:myBehavior="clr-namespace:MyApp.MyBehaviors"
    >
0
ответ дан 26 November 2019 в 21:08
поделиться

Мы используем следующий стиль для установки PreviewGotKeyboardFocus, который обрабатывает все события элемента управления TextBox, ComboBoxes и тому подобное:

    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <EventSetter Event="PreviewGotKeyboardFocus" Handler="SelectCurrentItem"/>
        </Style>
    </ListView.ItemContainerStyle>

И затем мы выбираем строку в коде позади:

    protected void SelectCurrentItem(object sender, KeyboardFocusChangedEventArgs e)
    {
        ListViewItem item = (ListViewItem) sender;
        item.IsSelected = true;
    }
42
ответ дан 26 November 2019 в 21:08
поделиться
1
ответ дан 26 November 2019 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: