Привязка Источника Предметов Списка к методу в Коде позади - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть база данных и XAML-файл, и у меня есть два списка, первый ( фунт-сила ) для перечисления тем ( ag_name , например, финансы, HR и т. Д.) c.) И второй ( liAn ) для перечисления задач в этой области, которые необходимо выполнить ( an_anligen , например, оплата бухгалтеру et c ..) , Дело в том, что я хочу, чтобы Предметы liAn были задачами выбранного Предмета из liAg , но только если атрибут an_fertig (an_done) имеет значение false. Этого я хочу добиться, привязав его к методу из кода.

Пожалуйста, помогите, Заранее спасибо. XAML:

<ListBox Grid.Column="0" 
         Grid.RowSpan="2"
         x:Name="liAg" 
         Loaded="liAg_Loaded" 
         DisplayMemberPath="ag_name"  />

<ListBox Grid.Column="1" 
         Grid.RowSpan="2"
         x:Name="liAn"  
          ItemsSource="{Binding liAn_Items}"
         DisplayMemberPath="an_titel" />

Кодовый код:

public partial class Main : UserControl
{
    public Main()
    {
        InitializeComponent();
    }

    DbEntities db = new DbEntities();

    private void liAg_Loaded(object sender, RoutedEventArgs e)
    {
        liAg.ItemsSource = db.ag_arbeitsgemeinschaft.ToList();
    }

    private void liAn_Items(object sender, RoutedEventArgs e)
    {
        string liag = liAg.SelectedItem.ToString();
        Console.WriteLine(liag);

        var erg = from a in db.an_anliegen
            where a.an_ag == liag && a.an_fertig != true
            select a;

        liAn.ItemsSource = erg.ToList();
    }
}

1 Ответ

0 голосов
/ 14 апреля 2020

Если вы действительно хотите связать с методом, вы можете использовать ObjectDataProvider: Документы Microsoft: Как: Привязать к методу .

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

Я настоятельно рекомендую не смешивать привязку данных XAML и прямое назначение свойств с помощью C#. При возможности следует использовать привязку данных.

Я создал несколько DependencyProperty свойств источника данных для свойств ListBox.ItemsSource, к которым необходимо привязаться. Поскольку вы не предоставили никаких сведений о типе элемента данных, я связал ListBox с коллекцией вымышленного типа DataItem:

MainWindow.xaml.cs

partial class MainWindow : Window
{
  public static readonly DependencyProperty DataItemsProperty = DependencyProperty.Register(
    "DataItems",
    typeof(IEnumerable),
    typeof(MainWindow),
    new PropertyMetadata(default(IEnumerable)));

  public IEnumerable DataItems
  {
    get => (IEnumerable) GetValue(MainWindow.DataItemsProperty);
    set => SetValue(MainWindow.DataItemsProperty, value);
  }

  public static readonly DependencyProperty TasksProperty = DependencyProperty.Register(
    "Tasks",
    typeof(IEnumerable),
    typeof(MainWindow),
    new PropertyMetadata(default(IEnumerable)));

  public IEnumerable Tasks
  {
    get => (IEnumerable) GetValue(MainWindow.TasksProperty);
    set => SetValue(MainWindow.TasksProperty, value);
  }

  public MainWindow()
  {
    this.DataItems = db.ag_arbeitsgemeinschaft.ToList();
  }

  private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
  {
    // Cast the ListBox.SelectedItem from object to the data type
    DataItem selectedItem = e.AddedItems.OfType<DataItem>().FirstOrDefault();
    if (selectedItem == null)
    {
      return;
    }

    // Access the selected item's members
    string displayedValue = selectedItem.ag_name;

    // Execute query
    var erg = from a in db.an_anliegen
            where a.an_ag == displayedValue && !a.an_fertig
            select a;

    // Update binding source of the ListBox named 'liAn'
    this.Tasks = erg.ToList();
  }
}

MainWindow.xaml

<Window>
  <ListBox x:Name="liAg" 
           ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=MainWindow}, 
                         Path=DataItems}"
           DisplayMemberPath="ag_name"
           SelectionChanged="OnSelectionChanged" />

  <ListBox x:Name="liAn"  
           ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=MainWindow}, 
                         Path=Tasks}"
           DisplayMemberPath="an_titel" />
</Window>
...