0

これは私のモデルです

public class PersonModel : INotifyPropertyChanged
{ 
    private string _firstname;
    public string FirstName 
    { 
        get {return _firstname; }
        set { _firstname = value; RaisePropertyChanged("FirstName"); } 
    }

    private string _lastname;
    public string LastName
    {
        get { return _lastname; }
        set { _lastname = value; RaisePropertyChanged("LastName"); }
    } 

    public string FullName 
    {
        get { return string.Format("{0} {1}", FirstName, LastName); } 
    }

    protected void RaisePropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
} 

基本的にユーザーコントロールのビューがあります

<UserControl x:Class="WpfApplication1.UserControl1"
         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:local="clr-namespace:WpfApplication1"             
         mc:Ignorable="d"            
         d:DesignHeight="300" d:DesignWidth="300"                
         Visibility="{Binding HideStatus, Mode=TwoWay}">
<UserControl.DataContext>
    <local:PersonViewModel></local:PersonViewModel>
</UserControl.DataContext>  
     <Grid>      
    <Grid.RowDefinitions>
        <RowDefinition Height="117*"></RowDefinition>
        <RowDefinition Height="33*"></RowDefinition>
        <RowDefinition Height="75*"></RowDefinition>
        <RowDefinition Height="75*"></RowDefinition>
    </Grid.RowDefinitions>
    <TextBlock Grid.Row="0" Text="FirstName"></TextBlock>
    <TextBox Text="{Binding FirstName,Mode=TwoWay}" Name="txtFirstName" Margin="115,0,0,67" DataContext="{Binding Path=Person}" Background="#FFF0F0F0" />
    <TextBlock Text="FirstName" Margin="0,71,0,0" Grid.RowSpan="2"></TextBlock>
    <TextBox Text="{Binding LastName,Mode=TwoWay}" Name="txtLastName" Margin="115,90,0,12" Background="#FFF0F0F0" DataContext="{Binding Path=Person}" Grid.RowSpan="2" />
    <Button Grid.Row="3" Content="Button" Height="29" HorizontalAlignment="Left" Margin="12,23,0,0" Name="button1" VerticalAlignment="Top" Width="75" Command="{Binding UpdateView}" />
</Grid>

「メインUIから更新」ボタンが1つあるメインウィンドウと、作成済みのユーザーコントロール

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="350" Width="525"

    xmlns:model="clr-namespace:WpfApplication1"
    >
<Grid>
    <Grid.DataContext>
        <local:PersonViewModel/>
    </Grid.DataContext>
    <local:UserControl1 x:Name="control1" />
    <Button Content="Update From Main UI" Height="23" Command="{Binding UpdateView}" HorizontalAlignment="Left" Margin="358,276,0,0" Name="button1" VerticalAlignment="Top" Width="145" />
</Grid>

問題は、ユーザーコントロール内のボタンをクリックすると変更が更新されることですが、メインウィンドウからボタンをクリックしようとすると同じことが起こりません。何が問題ですか?

4

1 に答える 1

1

DataContextメイン Window の は、UserControl の とは別のクラスインスタンスですPersonViewModelDataContextしたがって、UpdateViewメイン ウィンドウから実行しても、UserControl は更新されません。

これをメイン ウィンドウに書き込む必要があります。

<Button Command="{Binding Path=DataContext.UpdateView, ElementName=control1}" ... />

を介しElementNameて、Binding にユーザー コントロールを参照するように指示します。経由DataContext.UpdateViewで、ユーザー コントロールのUpdateViewコマンドを参照しています。

于 2012-05-29T17:37:47.910 に答える