2016-12-23 4 views
1

일부 데이터 바인딩에 어려움을 겪고 있습니다. 내 MainWindow에서 나는 데이터 바인딩을 위해 사용할 속성을 보유하기 위해 "Properties"클래스의 속성 Result에 데이터 바인딩되는 2 개의 버튼을 가지고 있습니다. 버튼은 기본적으로 숨겨져 있으며, 내가 볼 수있게하려면 단순히 "012"로 바뀌는 속성을 Result으로 설정하십시오.속성을 업데이트 한 후 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 있습니다. 내 "속성"클래스에서

나는 아래에 있고 나는 "참"를하여 PropertyChanged 이벤트가 null 따라서 이벤트가 터지지 않 속성을 변경할 때

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)); 
     } 
    } 

INotifyPropertyChanged을 구현하지만 어떤 이유입니다.

왜 이런 일이 발생하는지 알고 싶습니다. 이 코드가 내 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

MainControl 내부의 UserControl에서 Properties 클래스를 인스턴스화했습니다. 그런 다음 속성 클래스 내에서 메서드를 호출하여 Result 값을 변경합니다. 그러나 버튼은 MainWindow의 일부이며 usercontrol이 아닙니다. 어떤 디자인인지 잘 모르겠지만 사용자 콘트롤 (다른 뷰) 사이를 전환 할 때 정적 인 상태를 유지하고 싶습니다. – ganjeii

관련 문제