Во-первых, извините за плохой английский 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