从 mui Link (WPF) 更改用户控件的内容

Change the content of a User Control from the mui Link (WPF)

我的项目遇到了一些问题。我有一个 moderntab,我通过请求将 link 填充到数据库中。我请求的结果 return 一个字符串列表,它将成为我的 moderntab link 的显示名称。我在后面的代码中创建了所有 link,我希望当我单击 link 时,用户控件的内容会改变显示名称的功能。

目前,我知道如何在它检测到我更改源时获取显示名称。但我希望所有 link 都具有相同的来源,并且用户控件的内容根据所选 link 的显示名称发生变化。

那是我的 xaml moderntab 代码:

<Grid Style="{StaticResource ContentRoot}">
    <mui:ModernTab Layout="List" Name="listEcole" SelectedSourceChanged="listEcole_SelectedSourceChanged"/>
</Grid>

这就是背后的代码:

public ListEcoles()
{
    InitializeComponent();
    List<string> listEcoles = MainWindow._RE.ListEcoles();
    foreach (string nomEcole in listEcoles)
        listEcole.Links.Add(new Link() { DisplayName = nomEcole, Source = new Uri("/Controles/EcoleControl.xaml", UriKind.Relative) });
}

private void listEcole_SelectedSourceChanged(object sender, SourceEventArgs e)
{
    var selectedLink = listEcole.Links.FirstOrDefault(x => x.Source == listEcole.SelectedSource);
    if (selectedLink != null)
    {
        string selectedDisplayName = selectedLink.DisplayName;
        MessageBox.Show(selectedDisplayName);
    }
}

它在这里不起作用,因为我的 link 的每个来源都是相同的,所以事件永远不会进行。

有人能帮帮我吗

然后处理另一个类似 PreviewMouseLeftButtonUp 的事件。您可以使用辅助方法在可视化树中找到 ListBoxItem,然后使用 ListBoxItemDataContext [=20= 获取对相应 Link 对象的引用].

试试这个:

public ListEcoles()
{
    InitializeComponent();
    List<string> listEcoles = MainWindow._RE.ListEcoles();
    foreach (string nomEcole in listEcoles)
        listEcole.Links.Add(new Link() { DisplayName = nomEcole, Source = new Uri("/Controles/EcoleControl.xaml", UriKind.Relative) });
    listEcole.PreviewMouseLeftButtonUp += ListEcole_MouseLeftButtonUp;
}

private void ListEcole_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    ListBoxItem lbi = e.OriginalSource as ListBoxItem;
    if (lbi == null)
    {
        lbi = FindParent<ListBoxItem>(e.OriginalSource as DependencyObject);
    }

    if (lbi != null)
    {
        Link selectedLink = lbi.DataContext as Link;
        if (selectedLink != null)
        {
            string selectedDisplayName = selectedLink.DisplayName;
            MessageBox.Show(selectedDisplayName);
        }
    }
}

private static T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject
{
    var parent = VisualTreeHelper.GetParent(dependencyObject);

    if (parent == null) return null;

    var parentT = parent as T;
    return parentT ?? FindParent<T>(parent);
}