c# XAML 从同一页面上的其他 UserControl 访问 UserControl
c# XAML Access UserControl from other UserControl on same page
类似的问题已经回答 here。不同之处在于我的 Page-UserControl1-UserControl2 具有以下结构:
在页面上,我有一个包含多个 ListBoxItem 的 ListBox,每个 Item 都基于 UserControl1。 UserControl 也基于同一页面,但只有一个实例。
当我链接到另一个线程时,我无法执行以下操作:
我在Control1代码隐藏的顶部引入了一个属性:
public Control2 ctrl2 { get; set; }
然后我在页面的 xaml 文件中给 Control2 取了一个名字:
<local:Control2 Grid.Row="2" x:Name="NameOfControl2"></local:Control2>
下一步我想做的是将Control2 的实例传递给刚在Control1 中设置的属性。因此,在页面代码隐藏的 OnLoad 方法中,我想执行以下无法工作的操作,因为此时 Control1 的实例未知:
Control1.ctrl2 = NameOfControl;
这样我就可以从 UserControl1 的每个实例访问我的 UserControl2,但是我该怎么做呢?
谢谢
//回应 AMINE 的评论:
这是页面的xaml:
<ListView Grid.Row="1" Margin="0 0 0 5"
x:Name = "Box"
HorizontalAlignment="Center"
ScrollViewer.VerticalScrollBarVisibility="Auto"
ContinuumNavigationTransitionInfo.IsEntranceElement="True">
<ListView.ItemTemplate>
<DataTemplate>
<local:UserControl1 x:Name="NameOfControl1" DataContext="{Binding ElementName=Box,Path=DataContext}"/>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel VerticalAlignment="Bottom"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
在代码隐藏中,我用以下内容填充项目:
StandardTweetBox.Items?.Add(MySpecialClass);
//this.DataContext = NameOfSendControl;
StandardTweetBox.DataContext = NameOfSendControl;
在 MainPage 代码隐藏中放置:
this.DataContext = new YourViewModel();
Box.DataContext = this.DataContext;
并用这个替换你的 xaml :
<ListView Grid.Row="1" Margin="0 0 0 5"
x:Name = "Box"
HorizontalAlignment="Center"
ScrollViewer.VerticalScrollBarVisibility="Auto"
ContinuumNavigationTransitionInfo.IsEntranceElement="True">
<ListView.ItemTemplate>
<DataTemplate>
<local:UserControl1 x:Name="ctrl1name" DataContext="{Binding ElementName=Box,Path=DataContext}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
和
<local:Control2 Grid.Row="2" x:Name="NameOfControl2" DataContext="{Binding ElementName=Box,Path=DataContext}"></local:Control2>
现在,主页、usercontrl1 和 usercontrl2 将具有相同的 ViewModel
类似的问题已经回答 here。不同之处在于我的 Page-UserControl1-UserControl2 具有以下结构:
在页面上,我有一个包含多个 ListBoxItem 的 ListBox,每个 Item 都基于 UserControl1。 UserControl 也基于同一页面,但只有一个实例。
当我链接到另一个线程时,我无法执行以下操作:
我在Control1代码隐藏的顶部引入了一个属性:
public Control2 ctrl2 { get; set; }
然后我在页面的 xaml 文件中给 Control2 取了一个名字:
<local:Control2 Grid.Row="2" x:Name="NameOfControl2"></local:Control2>
下一步我想做的是将Control2 的实例传递给刚在Control1 中设置的属性。因此,在页面代码隐藏的 OnLoad 方法中,我想执行以下无法工作的操作,因为此时 Control1 的实例未知:
Control1.ctrl2 = NameOfControl;
这样我就可以从 UserControl1 的每个实例访问我的 UserControl2,但是我该怎么做呢?
谢谢
//回应 AMINE 的评论:
这是页面的xaml:
<ListView Grid.Row="1" Margin="0 0 0 5"
x:Name = "Box"
HorizontalAlignment="Center"
ScrollViewer.VerticalScrollBarVisibility="Auto"
ContinuumNavigationTransitionInfo.IsEntranceElement="True">
<ListView.ItemTemplate>
<DataTemplate>
<local:UserControl1 x:Name="NameOfControl1" DataContext="{Binding ElementName=Box,Path=DataContext}"/>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel VerticalAlignment="Bottom"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
在代码隐藏中,我用以下内容填充项目:
StandardTweetBox.Items?.Add(MySpecialClass);
//this.DataContext = NameOfSendControl;
StandardTweetBox.DataContext = NameOfSendControl;
在 MainPage 代码隐藏中放置:
this.DataContext = new YourViewModel();
Box.DataContext = this.DataContext;
并用这个替换你的 xaml :
<ListView Grid.Row="1" Margin="0 0 0 5"
x:Name = "Box"
HorizontalAlignment="Center"
ScrollViewer.VerticalScrollBarVisibility="Auto"
ContinuumNavigationTransitionInfo.IsEntranceElement="True">
<ListView.ItemTemplate>
<DataTemplate>
<local:UserControl1 x:Name="ctrl1name" DataContext="{Binding ElementName=Box,Path=DataContext}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
和
<local:Control2 Grid.Row="2" x:Name="NameOfControl2" DataContext="{Binding ElementName=Box,Path=DataContext}"></local:Control2>
现在,主页、usercontrl1 和 usercontrl2 将具有相同的 ViewModel