2

私の最初の質問の時間:)

私は次のものを持っています:

public class BuilderViewModel : INotifyPropertyChanged
{
    #region Implementation of INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion

    private double _contentScale = 1.0;

    public double ContentScale
    {
        get { return _contentScale; }
        set
        {
            _contentScale = value;
            NotifyPropertyChanged("ContentScale");
        }
    }

    public void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    } 

    #region Commands

    bool CanZoomIn() { return true; }
    void ZoomInExecute()
    {
        ContentScale += 1.0;
    }

    public ICommand ZoomIn { get { return new RelayCommand(ZoomInExecute, CanZoomIn); } }

    #endregion
}

対応するビュー:

<UserControl x:Class="PS_IDE.FormBuilder.View.Builder"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:local="clr-namespace:PS_IDE.FormBuilder.ViewModel">
    <UserControl.DataContext>
        <local:BuilderViewModel />
    </UserControl.DataContext>

    <TextBox Text="{Binding ContentScale}" Width="100" />

</UserControl>

BuilderViewModel の ZoomIn コマンドでビューのテキスト ボックスの値を更新しようとしています。コマンドは、Builder を含む別のユーザー コントロール UIBuilder から起動されています。UIBuilder からコマンドをデバッグして起動すると、ContentScale が適切に更新されていることがわかります。

ただし、テキスト ボックスの値は更新されません (ContentScale の初期値である "1" しか表示されません)。

私は何かが欠けていることを知っており、誰かが私を正しい方向に向けてくれることを願っています.

編集:コマンドを実行するコントロールを追加しました

<UserControl x:Class="PS_IDE.FormBuilder.UIBuilder"
         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:PS_IDE.FormBuilder"
         xmlns:ViewModel="clr-namespace:PS_IDE.FormBuilder.ViewModel"
         xmlns:View="clr-namespace:PS_IDE.FormBuilder.View" mc:Ignorable="d">  
    <UserControl.DataContext>
        <ViewModel:BuilderViewModel />
    </UserControl.DataContext>
    <DockPanel LastChildFill="True">

        ....

        <ToolBarTray DockPanel.Dock="Bottom" HorizontalAlignment="Right">
            <ToolBar>
                <Button Height="24" Width="24" ToolTip="Zoom In" Command="{Binding ZoomIn}">
                    <Image Source="Images/ZoomIn.png" Height="16"/>
                </Button>

                ....

            </ToolBar>
       </ToolBarTray>
       <View:Builder x:Name="builder" />
    </DockPanel>
</UserControl>
4

2 に答える 2

1

両方のビューで設定すると:

<UserControl.DataContext>
    <local:BuilderViewModel />
</UserControl.DataContext>

基本的に、ビューごとに 1 つずつ、 2 つの viewmodel を作成しています。したがって、コマンドがプロパティを更新すると、ビューモデルの 1 つで更新されますが、テキスト ボックスは別のビューモデルにバインドされます。

解決するにDataContext設定をBuilder.xaml

DataContextさらに、あなたのコントロールにあなたを渡す必要がありますBuilder(これにより、両方のビューが同じビューモデルを共有します)。

したがって、UIBuilder.xaml を変更します。

<View:Builder x:Name="builder" DataContext="{Binding}" />
于 2012-08-23T17:07:03.033 に答える
0

バインディングで Mode TwoWay を使用する

 Text ="{Binding ElementName=BuilderViewModel,
         Path=ContentScale,
         Mode=TwoWay,
         UpdateSourceTrigger=PropertyChanged}"

注: 通知を送信するには、監視可能なコレクションを使用してください

于 2012-08-23T15:48:54.780 に答える