0

バインディングがどのように機能するかについての私の見解では、基本的な何かが欠けていると感じているので、バインディングに関する簡単な質問があります。

コード ビハインドで MainWindow の DataContext を ViewModel に設定したので、特に指定しない限り、MainWindow.xaml のすべてのバインディングはこの DataContext のソースを想定していると思います。これは、UserControl (それ自体がそれを駆動する ViewModel を持っている) を使用している場合には当てはまらないようです。

私のシナリオは、コードで最もよく説明されています。

MainWindow.xaml.cs

private ViewModels.MainMenuViewModel vm;

public MainWindow()
{
    InitializeComponent();

    vm = new ViewModels.MainMenuViewModel();
    this.DataContext = vm;
}

MainWindow.xaml (コード ビハインドで設定されたデータ コンテキストを使用)

x:Class="Mediafour.Machine.EditorWPF.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:uc="clr-namespace:Machine.EditorWPF.Views"
xmlns:local="clr-namespace:Machine.EditorWPF"
xmlns:localVM="clr-namespace:Machine.EditorWPF.ViewModels"
Title="MainWindow" Height="350" Width="650">



  <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="auto"/>
        </Grid.ColumnDefinitions>
        <uc:MachineTreeView x:Name="MachineTreeView" Grid.Column="0" MachineDocument="{Binding Path=CurrentDocument}" />

MainWindowViewModel.cs

 public class MainWindowViewModel : ObservableObject
    {
       public MainWindowViewModel()
        {
            OpenMachine(@"D:\Projects\Agnes\EditorWPF\Test.machine");
        }

        private void OpenMachine(string filePath)
        {
            MachineDocument currentDocument = MachineDocument.OpenFile(filePath);
            CurrentDocument = currentDocument;
        }

        private MachineDocument _currentDocument;
        public MachineDocument CurrentDocument
        {
            get { return _currentDocument; }
            set
            {
                if (_currentDocument != null)
                {
                    _currentDocument.Dispose();
                    _currentDocument = null;
                }

                _currentDocument = value;
                base.RaisePropertyChanged("CurrentDocument"); //this fires
            }
        }

このアプローチを使用すると、MainWindow.xaml のバインド ステートメントでエラーが発生します。スヌープ バインディング エラーを見ると、CurrentDocumentプロパティがMachineViewModelに見つからないことが示されています。

System.Windows.Data Error: 40 : BindingExpression path error: 'CurrentDocument' property not found on 'object' ''MachineViewModel' (HashCode=27598891)'. BindingExpression:Path=CurrentDocument; DataItem='MachineViewModel' (HashCode=27598891); target element is 'MachineTreeView' (Name='MachineTreeView'); target property is 'MachineDocument' (type 'MachineDocument')

バインディングが MainWindow で行われるときにMachineViewModel見ているのはなぜですか?

MainWindow の他のバインディング プロパティは期待どおりに機能しますが、これは私が持っている唯一の UserControl バインディングです。

4

1 に答える 1

2

どちらかそれは単純な間違いです

  • としてMainMenuViewModelではなく設定していますMainWindowViewModelMainWindow.DataContext

または多分

于 2012-10-23T00:34:56.443 に答える