C# WPF将数据源传递到UserControl

C# WPF将数据源传递到UserControl,c#,wpf,xaml,user-controls,C#,Wpf,Xaml,User Controls,我有一个非常简单的用户控件: <UserControl x:Class="PointOfSale.UserControls.HousesGrid" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.

我有一个非常简单的用户控件:

<UserControl x:Class="PointOfSale.UserControls.HousesGrid"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">

<ItemsControl x:Name="LayoutRoot" ItemsSource ="{Binding PopularHouses}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="5"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ToggleButton
                Content="{Binding FormattedPanelTimeRemaining}"
                Style="{StaticResource MetroToggleButtonStyle}"
                Height="45"
                Width="80"
                VerticalAlignment="Center"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

如您所见,ItemSource属性绑定到父对象的ViewModel上的PopularHouses属性。这很有效。但是,我要做的是将LayoutRoot元素的ItemSource设置为父窗体上控件插入XAML的点处的另一个属性

最终结果应该是该用户控件的多个实例,绑定到父级datacontext上的多个不同属性


有人能解释一下如何实现吗?

您只需使用RelativeSource将UserControl的DataContext绑定到第一个ContentControl的DataContext即可

 DataContext="{Binding Path=DataContext, RelativeSource={RelativeSource AncestorType={x:Type ContentControl}}}"
我制作了以下样本:

主窗口是XAML

<Window x:Class="WpfDataContext.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfDataContext"
        Title="MainWindow" Height="350" Width="525"
        DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Grid>
        <local:UserControl1/>
    </Grid>
</Window>
然后,usercontrol XAML:

<UserControl x:Class="WpfDataContext.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             DataContext="{Binding Path=DataContext, RelativeSource={RelativeSource AncestorType={x:Type ContentControl}}}">
    <Grid>
        <TextBlock Text="{Binding SomeString}"/>
    </Grid>
</UserControl>

注意我们是如何绑定它的DataContext属性的,因为这是键


为了简单起见,我使用了文本块,但这一原则也适用于您的案例

您意识到您在逆向思考,对吗?为什么要更改绑定到的属性,而不是将viewmodel设置为泛型?如果希望从外部绑定
ItemsSource
,可以将其作为用户控件的依赖属性公开,只需将
LayoutRoot.ItemsSource
绑定到它。看见
<UserControl x:Class="WpfDataContext.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             DataContext="{Binding Path=DataContext, RelativeSource={RelativeSource AncestorType={x:Type ContentControl}}}">
    <Grid>
        <TextBlock Text="{Binding SomeString}"/>
    </Grid>
</UserControl>