2011-06-28 43 views
2

私はWPF/PRISMベースのアプリケーションを開発しています。親ビュー(usercontrol)には多くの領域があり、子ビュー(usercontrol)はそれらの領域にロードされます。子ビューが読み込まれると、コンソールにバインディングエラーが表示されます。バインドされたプロパティが子ビューのビューモデルの一部であっても、バインディングの解像度は親ビューのビューモデルを最初に見て、このエラーをスローします。アプリケーションは正常に動作しますが、私はこれらのエラーを取り除くことができるかどうかを知りたいのです。子のユーザコントロールのBindingExpressionパスエラー

私が書いた簡単なアプリでこれを再現することができました。

C#

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
     this.Loaded += (o, e) => { this.layout.DataContext = new ViewModel(); }; 
    } 
} 

public class ViewModel 
{ 
    public ViewModel() 
    { 
     this.SampleText = "Sample"; 
    } 

    public string SampleText { get; set; } 
} 

XAML

<Window x:Class="DataBindingResolution.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid x:Name="layout"> 
     <Grid.Resources> 
      <TextBlock x:Key="test" Text="{Binding SampleText}"/> 
     </Grid.Resources> 
     <Button Content="{StaticResource test}"/> 
    </Grid> 
</Window> 

あなたはこのサンプルを実行すると、あなたが見ることができます:

ボタンが正しく、「テキストを示していても、コンソールに印刷されたばかり

System.Windows.Data Error: 39 : BindingExpression path error: 'SampleText' property not found on 'object' ''MainWindow' (Name='')'. BindingExpression:Path=SampleText; DataItem='MainWindow' (Name=''); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')

をその中に「サンプル」があります。このメッセージがコンソールに表示されないようにするにはどうすればいいですか?私のアプリケーションは、読み込まれた子ビューごとに25以上のエラーを出力します。

答えて

3

あなたはおそらく二つのクラスに2つのviewmodelsを分ける必要があります。その後、親ViewModelを参照して、子ViewModelを参照させます。他のすべては拘束力によって達成することができます。以下のように、この簡略化され、XAMLは希望

public partial class MainWindow : Window  
{  
    public MainWindow()   
    {    
     InitializeComponent();    
     this.DataContext = new ParentViewModel();    
    }   
} 

public class ParentViewModel  
{ 
    public ViewModel()   
    { 
     this.Child = new ChildViewModel();  
    }   

    public ChildViewModel Child { get; set; }  
} 

public class ChildViewModel  
{ 
    public ViewModel()   
    { 
     this.SampleText = "Sample";   
    }   

    public string SampleText { get; set; }  
} 

<Window>  
<Grid x:Name="layout" DataContext="{Binding Child}"> 
    <Button Content="{Binding SampleText}"/> 
    </Grid> 
</Window> 
+0

親はビューが注入されているプリズム領域がすべてロードされていることを知らない。 – anivas

+0

この場合、各子ビューはスタンドアロンです。ビューを作成するプロセスは、ViewModelを子ビューに挿入する必要があります。ビューとビューモデルを解決するためにUnityを使用している場合は、両方を1つのステップで行うことができます。 http://www.wintellect.com/CS/blogs/sloscialo/archive/2011/05/19/yet-another-way-to-attach-viewmodels-to-views.aspx – SergioL

+0

を参照してください。それは、それがビューモデル解像度と関係しているとは決して考えられませんでした。ありがとう。 – anivas

0

LoadedイベントハンドラでDataContextを設定する必要がありますか?

私は少しの周りにコードを移動し、メッセージを防止:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = new ViewModel(); 
     //this.Loaded += (o, e) => { this.layout.DataContext = new ViewModel(); }; 
    } 
} 

public class ViewModel 
{ 
    public ViewModel() 
    { 
     this.SampleText = "Sample"; 
    } 
    public string SampleText { get; set; } 
} 
+0

これは実際に自分のアプリケーションで何が起こるかをシミュレートします。 MainWindowは独自のViewModelを持つ親ビューで、グリッドは独自のviewmodelを持つ子ビューです。子ビューモデルを親に、またはその逆に割り当てることはできません。 – anivas

+0

これはPrismと一緒に使用している依存性注入コンテナと何か関係があるのだろうかと思います。 Unityや別のものを使っていますか? – NickHeidke

+0

ユニティコンテナ。 – anivas

関連する問題