2016-12-23 6 views
1

データバインドに苦労しています。私のMainWindowでは、私はデータバインディングのために使用するプロパティを保持するために、厳密にプロパティ "クラス"のプロパティResultにデータバインドされている2つのボタンを持っています。ボタンはデフォルトでは表示されないようにしたい場合は、単に「Result」というプロパティを「True」に設定します。プロパティを更新した後、WPF PropertyChangedイベントがnullです。

プロパティが静的な値に設定されているため、ボタンは表示/非表示になります。私のXAMLそこで彼らは、「結果」プロパティにバインドされている

<StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> 
         <StackPanel.Resources> 
          <BooleanToVisibilityConverter x:Key="BoolToVis" /> 
         </StackPanel.Resources> 

         <Button x:Name="btnBack" Height="25" Content="&lt;- Back" Visibility="{Binding Path=Result, Converter={StaticResource BoolToVis}, 
          UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="75" Click="btnBack_Click" Margin="0,0,10,0" /> 

         <Button x:Name="btnNext" Height="25" Content="Next ->" Visibility="{Binding Path=Result, Converter={StaticResource BoolToVis}, 
          UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="75" Click="btnNext_Click" Margin="10,0,0,0"/> 
        </StackPanel> 

については以下を参照してください、と私は私の結合にUpdateSourceTrigger=Propertychangedを持っています。私の「プロパティ」クラスで

私は以下の持っているとINotifyPropertyChanged

bool _result; 

    #endregion 

    public bool Result { 
     get 
     { 
      return _result; 
     } 
     set 
     { 
      _result = value; 
      NotifyPropertyChanged("Result"); 

     } 
    } 

    #region EVENTS 



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

を実装しかし、私は「真」にプロパティを変更し、いくつかの理由でのPropertyChangedイベントがnullであるため、イベントが発生させたことがないです。

これはなぜ起こっているのですか?このコードは私のViewModelではなく、別のクラスにあるからでしょうか?

+0

それはあなたのビューモデルとビューモデルにする必要がありますが、あなたの 'DataContext'に割り当てる必要があります。 – jsanalytics

+0

お試しいただきありがとうございます。私はresutls – ganjeii

+0

で更新されますこれは動作します!ありがとうございました! – ganjeii

答えて

1

ウィンドウのDataContextをPropertiesクラスのインスタンスに設定し、DataContextが継承されているためStackPanelの親要素のDataContextプロパティを別のものに設定しないようにしてください。

次のサンプルコードを参照してください。 3秒の遅延の後に予想されるようにボタンが見えるようになります:

public partial class MainWindow : Window 
{ 
    private Properties _viewModel = new Properties(); 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = _viewModel; 

     this.Loaded += async (s, e) => 
     { 
      await Task.Delay(3000); 
      _viewModel.Result = true; 
     }; 
    } 
} 

public class Properties : INotifyPropertyChanged 
{ 
    bool _result; 
    public bool Result 
    { 
     get 
     { 
      return _result; 
     } 
     set 
     { 
      _result = value; 
      NotifyPropertyChanged("Result"); 

     } 
    } 

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

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WpfApplication1" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="300" Width="300"> 
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> 
     <StackPanel.Resources> 
      <BooleanToVisibilityConverter x:Key="BoolToVis" /> 
     </StackPanel.Resources> 

     <Button x:Name="btnBack" Height="25" Content="&lt;- Back" Visibility="{Binding Path=Result, Converter={StaticResource BoolToVis}, 
          UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="75" Margin="0,0,10,0" /> 

     <Button x:Name="btnNext" Height="25" Content="Next ->" Visibility="{Binding Path=Result, Converter={StaticResource BoolToVis}, 
          UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="75" Margin="10,0,0,0"/> 
    </StackPanel> 
</Window> 
+0

これはすばらしい答えです。コード参照のおかげです。私はその問題が何かを理解しました。私はクラス内からプロパティを設定していたとは言いませんでした。私は私の記述の中で少し欺いていたと思う。このプロパティはviewmodelから設定されているのではなく、Propertiesクラス自体から設定されています。それは明らかに悪いデザインであり、私は今それを知っています。好奇心から、なぜこれがうまくいかないのか? – ganjeii

+0

私はMainWindow内のUserControlからPropertiesクラスをインスタンス化していました。その後、プロパティクラス内のメソッドを呼び出してResult値を変更します。しかし、ボタンはMainWindowの一部であり、usercontrolではありません。私はかなり確信しているデザインも悪いですが、私はユーザーコントロール(別のビュー)の間で切り替えると静的なままにしておきたいと思います。 – ganjeii

関連する問題