Как выбрать объект TreeView из кода

Я улучшил решение, которое использует регулярное выражение для Pinhassi, поэтому оно также правильно обрабатывает края. Прежде чем проверять правильность ввода, сначала окончательная строка построена, как описано в документах android.

public class DecimalDigitsInputFilter implements InputFilter {

    private Pattern mPattern;

    private static final Pattern mFormatPattern = Pattern.compile("\\d+\\.\\d+");

    public DecimalDigitsInputFilter(int digitsBeforeDecimal, int digitsAfterDecimal) {
        mPattern = Pattern.compile(
            "^\\d{0," + digitsBeforeDecimal + "}([\\.,](\\d{0," + digitsAfterDecimal +
                "})?)?$");
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, 
                               int dstart, int dend) {

        String newString =
            dest.toString().substring(0, dstart) + source.toString().substring(start, end) 
            + dest.toString().substring(dend, dest.toString().length());

        Matcher matcher = mPattern.matcher(newString);
        if (!matcher.matches()) {
            return "";
        }
        return null;
    }
}

Использование:

editText.setFilters(new InputFilter[] {new DecimalDigitsInputFilter(5,2)});
26
задан Sergej Andrejev 2 June 2009 в 15:37
поделиться

4 ответа

Другой вариант - использовать привязку. Если у вас есть объект, с которым вы используете привязку для получения текста каждого TreeViewItem (например), вы можете создать стиль, который также связывает свойство IsSelected :

<TreeView>
    <TreeView.Resources>
        <Style TargetType="TreeViewItem">
            <Setter Property="IsSelected"
                    Value="{Binding Path=IsSelected, Mode=TwoWay}" />
        </Style>
    </TreeView.Resources>
</TreeView>

Это предполагает, что связанный объект имеет свойство IsSelected типа bool . Затем вы можете выбрать TreeViewItem , установив для IsSelected значение true для соответствующего объекта.

Тот же подход можно использовать с IsExpanded для управления раскрытием или сворачиванием TreeViewItem .

Если у вас есть объект, с которым вы используете привязку для получения текста каждого TreeViewItem (например), вы можете создать стиль, который также связывает свойство IsSelected :

<TreeView>
    <TreeView.Resources>
        <Style TargetType="TreeViewItem">
            <Setter Property="IsSelected"
                    Value="{Binding Path=IsSelected, Mode=TwoWay}" />
        </Style>
    </TreeView.Resources>
</TreeView>

Это предполагает, что связанный объект имеет свойство IsSelected типа bool . Затем вы можете выбрать TreeViewItem , установив для IsSelected значение true для соответствующего объекта.

Тот же подход можно использовать с IsExpanded для управления раскрытием или сворачиванием TreeViewItem .

Если у вас есть объект, с которым вы используете привязку для получения текста каждого TreeViewItem (например), вы можете создать стиль, который также связывает свойство IsSelected :

<TreeView>
    <TreeView.Resources>
        <Style TargetType="TreeViewItem">
            <Setter Property="IsSelected"
                    Value="{Binding Path=IsSelected, Mode=TwoWay}" />
        </Style>
    </TreeView.Resources>
</TreeView>

Это предполагает, что связанный объект имеет свойство IsSelected типа bool . Затем вы можете выбрать TreeViewItem , установив для IsSelected значение true для соответствующего объекта.

Тот же подход можно использовать с IsExpanded для управления раскрытием или сворачиванием TreeViewItem .

<TreeView>
    <TreeView.Resources>
        <Style TargetType="TreeViewItem">
            <Setter Property="IsSelected"
                    Value="{Binding Path=IsSelected, Mode=TwoWay}" />
        </Style>
    </TreeView.Resources>
</TreeView>

Предполагается, что связанный объект имеет свойство IsSelected типа bool . Затем вы можете выбрать TreeViewItem , установив для IsSelected значение true для соответствующего объекта.

Тот же подход можно использовать с IsExpanded для управления раскрытием или сворачиванием TreeViewItem .

<TreeView>
    <TreeView.Resources>
        <Style TargetType="TreeViewItem">
            <Setter Property="IsSelected"
                    Value="{Binding Path=IsSelected, Mode=TwoWay}" />
        </Style>
    </TreeView.Resources>
</TreeView>

Предполагается, что связанный объект имеет свойство IsSelected типа bool . Затем вы можете выбрать TreeViewItem , установив для IsSelected значение true для соответствующего объекта.

Тот же подход можно использовать с IsExpanded для управления раскрытием или сворачиванием TreeViewItem .

32
ответ дан 28 November 2019 в 05:16
поделиться

Попробовав разные растворы, я пришел на на этот сайт. Чжоу Юн показывает, как программно расширить все узлы TreeView. В его методе есть две основные идеи:

  • ContainerFromItem будет возвращать контейнер только в том случае, если элемент является прямым потомком элемента. В TreeView это означает, что будет возвращен только дочерний контейнер первого уровня, и вам нужно вызвать ContainerFromItem для дочернего TreeViewItem, чтобы получить контейнер следующего уровня. расширен. Это означает, что для выбора TreeViewItem необходимо развернуть все элементы, предшествующие требуемому элементу. На практике это означает, что нам нужно будет указать путь к элементу, который мы хотим выбрать, а не только к элементу.

Вот код, который я закончил с

public static void SelectItem(this ItemsControl parentContainer, List<object> path)
{
    var head = path.First();
    var tail = path.GetRange(1, path.Count - 1);
    var itemContainer = parentContainer.ItemContainerGenerator.ContainerFromItem(head) as TreeViewItem;

    if (itemContainer != null && itemContainer.Items.Count == 0)
    {
        itemContainer.IsSelected = true;

        var selectMethod = typeof(TreeViewItem).GetMethod("Select", BindingFlags.NonPublic | BindingFlags.Instance);
        selectMethod.Invoke(itemContainer, new object[] { true });
    }
    else if (itemContainer != null)
    {
        itemContainer.IsExpanded = true;

        if (itemContainer.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
        {
            itemContainer.ItemContainerGenerator.StatusChanged += delegate
            {
                SelectItem(itemContainer, tail);
            };
        }
        else
        {
            SelectItem(itemContainer, tail);
        }
    }
}
4
ответ дан Sergej Andrejev 15 October 2019 в 08:17
поделиться

В моем случае (у меня была та же проблема), но было неуместно использовать привязку к свойству IsSelected объекта Data, а также я не мог легко получить путь к элементу дерева, поэтому следующий код отлично справился с задачей:

  private void SelectTreeViewItem(object item)
    {
        try
        {
            var tvi = GetContainerFromItem(this.MainRegion, item);

            tvi.Focus();
            tvi.IsSelected = true;

            var selectMethod =
                typeof(TreeViewItem).GetMethod("Select",
                System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

            selectMethod.Invoke(tvi, new object[] { true });
        }
        catch { }
    }

  private TreeViewItem GetContainerFromItem(ItemsControl parent, object item)
    {
        var found = parent.ItemContainerGenerator.ContainerFromItem(item);
        if (found == null)
        {
            for (int i = 0; i < parent.Items.Count; i++)
            {
                var childContainer = parent.ItemContainerGenerator.ContainerFromIndex(i) as ItemsControl;
                TreeViewItem childFound = null;
                if (childContainer != null && childContainer.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
                {
                    childContainer.ItemContainerGenerator.StatusChanged += (o, e) =>
                        {
                             childFound = GetContainerFromItem(childContainer, item);
                        };
                }
                else
                {
                     childFound = GetContainerFromItem(childContainer, item);                            
                }
                if (childFound != null)
                    return childFound;                 
            }
        }
        return found as TreeViewItem;
    }
2
ответ дан Mladen Nikolov 15 October 2019 в 08:17
поделиться

Да, метод ContainerFromItem ничего не возвращает, даже если вы вызываете его из прямого родительского TreeViewItem.

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

0
ответ дан 28 November 2019 в 05:16
поделиться
Другие вопросы по тегам:

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