从 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
,然后使用 ListBoxItem
的 DataContext
[=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);
}
我的项目遇到了一些问题。我有一个 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
,然后使用 ListBoxItem
的 DataContext
[=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);
}