2017-08-03 5 views
1

にDataSourceを渡す:あなたはItemSourceプロパティが親のビューモデルのPopularHousesプロパティにバインドされて見ることができるようにWPFは、私は非常に単純なユーザーコントロール持つユーザーコントロール

<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> 

を。これは素晴らしいです。しかし、私がしたいのは、LayoutRoot要素のItemSourceを、コントロールがXAMLに挿入されている親フォーム上のポイントにある別のプロパティに設定することです。

最終結果は、このユーザーコントロールの複数のインスタンスであり、親のデータコンテキスト上のいくつかの異なるプロパティにバインドされている必要があります。

誰かがこれを実装する方法を説明できますか?

+1

あなたは右、後方考えている実現するために適用されますか? バインドするプロパティを変更して、ビューモデルを汎用的にしないのはなぜですか? – Mishka

+1

'ItemsSource'を外部から* binde-able *にしたい場合は、それをユーザコントロールの依存性プロパティとして公開し、単純に' LayoutRoot.ItemsSource'をバインドします。 [この回答](https://stackoverflow.com/a/5700294/1997232)を参照してください。 – Sinatr

答えて

0

RelativeSourceを使用して、最初のContentControlのdatacontextにUserControlのDataContextをバインドするだけで済みます。

DataContext="{Binding Path=DataContext, RelativeSource={RelativeSource AncestorType={x:Type ContentControl}}}" 

私は次のサンプルを作っています

私達はちょうどこのサンプルの目的のために自己へののDataContextを設定

<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> 

メインウィンドウのXAML。分離コードでは、我々はそれがどのように動作するかを示すために、単純なプロパティを定義します。

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    public string SomeString { get; set; } = "Hello"; 
} 

すると、ユーザーコントロールのXAML:これが鍵ですので、我々はそのDataContextプロパティをバインドする方法

<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> 

注意を。

は、私は簡単にするためのTextBlockを使用しますが、原則はまた、あなたのケース

関連する問題