1

Windows私は2つと1つで構成されるテストアプリケーションを持っていますUserControl

Window同じを使用してそれぞれにコントロールを挿入したいDataContext:

MainWindow.xaml:

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:view="clr-namespace:WpfApplication2.View"
    xmlns:viewModel="clr-namespace:WpfApplication2.ViewModel"
    Title="MainWindow" Height="350" Width="525">

<Window.DataContext>
    <viewModel:ControlColorViewModel x:Name="dataContext1"/>
</Window.DataContext>

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="0.2*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>

    <Button Grid.Column="0" Width="64" Height="64" Command="{Binding     
     Path=PressedButton}">Press</Button>

    <view:ControlColor Grid.Column="1" />

    </Grid>
</Window>

ControlColor.xaml:

<UserControl x:Class="WpfApplication2.View.ControlColor"
         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" 
         xmlns:viewModel="clr-namespace:WpfApplication2.ViewModel"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">


<Grid Background="{Binding Path=BackgroundColor}">

</Grid>
</UserControl>

ControlColorViewModel.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Media;
using System.Windows.Input;

namespace WpfApplication2.ViewModel
{
class ControlColorViewModel : ViewModelBase
{
    private Brush backgroundColor;
    public Brush BackgroundColor
    {
        get { return this.backgroundColor; }
        set
        {
            if (this.backgroundColor != value)
            {
                this.backgroundColor = value;
                OnPropertyChanged("BackgroundColor");
            }
        }
    }

    public ICommand PressedButton { get { return new RelayCommand(param =>    
    this.SetPressedButton()); } }

    public ControlColorViewModel()
    {
    }

    private void SetPressedButton()
    {
        BackgroundColor = Brushes.Orange;
    }
  }
}

Window2.xaml:

<Window x:Class="WpfApplication2.Window2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:view="clr-namespace:WpfApplication2.View"
    Title="Window2" Height="300" Width="300">
<Grid>

    <view:ControlColor />

</Grid>
</Window>

ボタンが押されると、MainWindow の ContentControl の背景がオレンジ色になり、Window2 に挿入された ContentControl にも同じものが必要です。同じデータコンテキストを使用します。

MainWindow で使用されているのと同じデータコンテキストを取得するにはどうすればよいですか?

前もって感謝します。

4

3 に答える 3

1

多くの方法があります。簡単なのは、共通の共有モデル プロパティ (CommonModel) を用意し、それをすべての ViewModel に送信することです。次のステップは、EventAggregator を使用することですが、私の考えでは、あなたには複雑すぎます..

于 2012-12-20T12:17:49.397 に答える
0

私はWPFに少し慣れていませんが(WinFormsのバックグラウンドが多い)、正しく理解できれば、アプリファイルリソースでdataContext1を定義でき、両方がそれを参照できます。

于 2012-12-20T12:17:16.117 に答える
0

You can use something called Dependency Injection to get your controls to use the same DataContext.

Basically, you need to take it out of the XAML and 'find/resolve' your shared ControlColorViewModel in the constructor for your controls.

于 2012-12-20T12:11:00.647 に答える