2016-06-28 14 views
1

私はかなり新しくC#です。メニューとテキストブロックを含むWPFウィンドウを作成しようとしていますが、データバインディングの作業はありません。 インターネット上のいくつかのページとフォーラムを見ましたが、人々は常にDataContextの設定について話していましたが、私のMainWindowがDataContextとみなされない理由はわかりません。私は何か非常に間違っているのですか?C#WPFデータバインディングが機能しない

<Window x:Class="holdingseditor.MainWindow" 
<Grid> 
    <TextBlock Height="30" Margin="0,24,0,0" Width="675" Text="{Binding DbRibbonText}" Background="{Binding DbRibbonColor}"/> 
    <TextBlock Height="30" Margin="675,24,0,0" Width="472" Background="{Binding WfRibbonColor}" Text="{Binding WfRibbonText}"/> 
    <Menu HorizontalAlignment="Left" Height="24" Margin="0,0,0,0" VerticalAlignment="Top" Width="1155"> 
     <MenuItem Header="_View"> 
      <MenuItem Header="Show _Archived Files History" Height="22" FontSize="12" Margin="0" Click="M_ShowArchivedFiles" IsEnabled="{Binding Path=DiesenameLoaded}"/> 
     </MenuItem> 

     <MenuItem Header="_Workflow"> 
      <MenuItem Header="O_utside Mode" Height="22" FontSize="12" Margin="0" IsCheckable="true" IsChecked="{Binding IsWfOutside}"/> 
     </MenuItem> 
    </Menu> 
</Grid>  
</Window> 

そして、私の性質は、そのようになります:ここに私のXAMLはある

namespace holdingseditor 
{ 
    public partial class MainWindow : Window 
    { 
     public bool DiesenameLoaded 
     {get { return false; }} 

     public bool IsWfOutside 
     {get { return true; }} 

     public string DbRibbonText 
     {get {return "my text";}} 

     public Color DbRibbonColor 
     {get {return Color.FromArgb(255, 0, 0, 255);}} 

    } 
} 

答えて

4

はあなたのDataContext

を設定しているようにあなたはどこを見れためにあなたのXAMLを伝えるために持って見ていませんそのデータのために。あなたはおそらくあなたの出力ウィンドウバインディング表現のエラーに表示されます。あなたのコンストラクタで

これはあなたが結合しているプロパティを検索するMainWindow.csファイルに移動するには、あなたのXAMLを教えてくれます

this.DataContext = this;

を置きます。 MVVMの学習を開始するときに、DataContextをビューモデルにして、背後のコードの使用をやめるようにします。ここで

は簡単な例である:あなたのMainWindow.xaml.csであなたのMainWindow.xaml

<TextBlock Text="{Binding myTextProperty}"/> 

私が設定する前に、私はプロパティを設定しています

public partial class MainWindow : Window{ 
     public String myTextProperty {get; set;} 

     public MainWindow(){ 
      InitializeComponent(); 
      myTextPropety = "It works!"; 
      this.DataContext = this; 
     } 
} 

お知らせ私のDataContext。私はこれを意図的にやっています。あなたのxamlは一度だけそのプロパティ値を探します。

あなたはそれを更新したい場合は、プロパティを変更するとき、あなたはあなたがについてon the MSDN Articleと、このスタックオーバーフロー条にImplementing INotifyPropertyChanged - does a better way exist?

+0

を読むことができるINotifiyPropertyChanged

を実装する必要があなたの答えのためのあなたのアンソニーありがとうございます。コンストラクタでDataContextを設定すると、最終的には多くのことが変わります。 メニュー項目のバインドには問題ありませんが、2つのTextBlock(テキストと背景のバインディング)にあるバインディングでは常に機能しません。 プロパティの更新に関しても、何か他のことをしなくてもうまく動作すると思いました。大したことではないと私は多くの複雑さを感じています。正直なところ、C++で開発する人は、これらのデータバインディングを使用するのではなく、手動ですべてを手動で変更する方が簡単です。 –

+1

私はTextBlocksのために、私の色のタイプが問題であることを知りました。 xamlはSolidColorBrushを想定しています。 –

+0

@pashashadkamiはい、バインドしようとしているものに正しい型を渡していることを確認する必要があります。コンバータを使用することもできます。 これまで、データバインディングの学習を始めた技術者は、手作業で行う方が簡単だと言いました。あなたが実際にそれを行う方法と、それがMVVMでどのように強力であるかを実際に学ぶまで、その後、あなたは振り返ることはありません。 –

関連する問題