2016-12-23 72 views
1

我正在努力與一些數據綁定。在我的MainWindow中,我有2個按鈕,這些按鈕是數據綁定到屬性Result的「屬性」類 - 嚴格用於保存將用於數據綁定的屬性。這些按鈕默認是隱藏的,當我希望它們變得可見時,我簡單地將它們綁定到的屬性設置爲「真」更新屬性後WPF PropertyChanged事件爲空

我知道數據綁定正在工作,因爲如果我將該屬性設置爲靜態值,這些按鈕是可見/不可見的。請參閱下面我的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)); 
     } 
    } 

但由於某些原因,當我更改屬性爲「True」 PropertyChanged事件爲空,因此該事件永遠不會觸發。

任何想法爲什麼發生這種情況?難道是因爲這段代碼不在我的ViewModel中,只是在一個單獨的類中?

+0

這應該是您的視圖模型和視圖模型應該被分配到你的'DataContext'。 – jsanalytics

+0

謝謝j現在就試一試。我會更新與resutls – ganjeii

+0

這工程!謝謝! – ganjeii

回答

1

確保您已將窗口的DataContext設置爲您的Properties類的實例,並且您沒有將StackPanel的任何父元素的DataContext屬性設置爲其他內容,因爲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類。然後調用屬性類中的方法來更改結果值。但按鈕是MainWindow的一部分,而不是用戶控件。我很確定這也是糟糕的設計,但我希望按鈕在用戶控件(不同視圖)之間切換時保持靜態。 – ganjeii

相關問題