TreeViewItem - Ошибка привязки (Horizontal и VerticalContentAlignment) - PullRequest
0 голосов
/ 10 марта 2020

Во-первых, извините за плохой английский sh Я французский багет.
Во-вторых, я уже знаю, что вопрос уже был размещен здесь , но это не сработало для меня .

Я делаю приложение, которое воспроизводит фильтр из Excel, но вместо того, чтобы иметь флажок в виде списка, я делаю это с TreeView с флажком «выбрать все» в качестве узла root и флажки значений являются дочерними по отношению к узлу root. Я создаю свои чекбоксы программно, так как значения поступают из базы данных.

Проблема в том, что я получил эти ошибки:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=VerticalContentAlignment; DataItem=null; target element is 'TreeViewItem' (Name=''); target property is 'VerticalContentAlignment' (type 'VerticalAlignment')
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=HorizontalContentAlignment; DataItem=null; target element is 'TreeViewItem' (Name=''); target property is 'HorizontalContentAlignment' (type 'HorizontalAlignment')


Эти ошибки безвредны, но Это все еще проблема, так как моя таблица довольно большая, и время, чтобы заполнить консоль этими сообщениями об ошибках, занимает довольно много времени. Я не привязываю выравнивание где-либо, поэтому я предполагаю, что это поведение по умолчанию для использования родительского выравнивания.

Код, который генерирует флажки:
Переменная "resultats" является DataTable I получил после выполнения моего запроса к базе данных.

// Var declarations
valeurParColonne = new List<ObservableCollection<TreeViewItem>>();
SortedList<string, TreeViewItem> liste;
TreeViewItem tvi;
CheckBox cb;
string valeur, cle;

// Looping through columns
for (int i = 0; i < resultats.Columns.Count; ++i)
{
    liste = new SortedList<string, TreeViewItem>();

    // Looping through rows
    foreach (DataRow row in resultats.Rows)
    {
        if (liste.ContainsKey(row[i].ToString()))
            continue;

        if (row[i] == null)
        {
            valeur = "(Vide)";
            cle = "";
        }
        else
        {
            valeur = row[i].ToString();
            cle = row[i].ToString();
        }

        cb = new CheckBox();
        cb.IsChecked = true;
        cb.Content = valeur;
        cb.Checked += check;
        cb.Unchecked += uncheck;
        cb.Tag = i;

        tvi = new TreeViewItem();
        tvi.Header = cb;

        liste.Add(cle, tvi);
    }

    // I was using SortedList and I tried to make it an observable collection but that doesn't make any change
    valeurParColonne.Add(new ObservableCollection<TreeViewItem>(liste.Values));

    // I tried to implement the INotifyPropertyChanged but that doesn't change anything
    OnPropertyChanged("valeurParColonne");
}


Xaml-код, где используется список TreeViewItem:

<TreeView Height="150" Grid.Row="2">
    <TreeViewItem IsExpanded="True">
        <TreeViewItem.Header>
            <CheckBox Content="Tout sélectionner" IsChecked="True" IsThreeState="True" Checked="toutSelectionner" Unchecked="rienSelectionner" Indeterminate="indetermine"/>
        </TreeViewItem.Header>

        <TreeViewItem.ItemsSource>
            <MultiBinding Converter="{StaticResource convertisseurListe}">
                <Binding Path="valeurParColonne" RelativeSource="{RelativeSource AncestorType=local:Planning}"/>
                <Binding RelativeSource="{RelativeSource TemplatedParent}"/>
            </MultiBinding>
        </TreeViewItem.ItemsSource>
    </TreeViewItem>
</TreeView>


Конвертер, который подключает список TreeViewItem к дереву:

class ConvertisseurListe : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        // Testing for wrong values
        if (values == null || values.Length != 2 || values[0] == null || values[1] == null)
            return null;

        // Values casting
        List<ObservableCollection<TreeViewItem>> liste = (List<ObservableCollection<TreeViewItem>>)values[0];
        GridViewColumnHeader header = (GridViewColumnHeader)values[1];
        GridViewHeaderRowPresenter gvhrp = (GridViewHeaderRowPresenter)header.Parent;

        // Getting column index
        int i = 0;
        for (; i < gvhrp.Columns.Count; ++i)
            if (gvhrp.Columns[i] == header.Column)
                break;

        // Test if the index found is valid
        if (i == gvhrp.Columns.Count || i >= liste.Count)
            return null;

        return liste[i];
    }

    // Not used
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}


Кто-нибудь знает, как это исправить?

PS: Я имею протестировано для запуска приложения непосредственно из .exe и, кажется, работает нормально (возможно, потому что сообщения об ошибках не печатаются ни на какой консоли), но мне все еще нужно избавиться от этого поведения.

Спасибо,
PtitJao

...