2015-10-07 49 views
0

加载数据时,我想隐藏WPF控件(全部包含在网格中)的内容并显示加载trobber。Grid上的WPF中的Visiblity绑定

MainWindow.xaml:

<Grid Visibility="{Binding IsContentVisible}"> 
<!-- MyCustomView is hosted here --> 
</Grid> 

主窗口的数据上下文是MainWindowViewModel,这也从ViewModelBase

public class MainWindowViewModel : ViewModelBase 
{} 

MyCustomView.xaml导出:

<Grid> 
<TextBox Text="{Binding Data}" /> 
<TextBlock>This shouldn't be visible during the 2.5 sec loading time, but it is!</TextBlock> 
</Grid> 

MyCustomViewModel.cs:

public class MyCustomViewModel : ViewModelBase 
{ 
    public async void LoadData() 
    { 
     IsContentVisible = Visibility.Hidden; 
     OnPropertyChanged("IsContentVisible"); 
     // Display loading.gif 
     Data = await repository.LoadData(); 
     // Hide loading.gif 
     IsContentVisible = Visibility.Visible; 
     OnPropertyChanged("IsContentVisible"); 
    } 
} 

ViewModelBase.cs:

public class ViewModelBase : INotifyPropertyChanged 
{ 
    private Visbility isContentVisible = Visibility.Visible; 
    public Visbility IsContentVisible 
    { 
     get { return isContentVisible; } 
     set { isContentVisible = value; } 
    } 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

     private ViewModelBase currentViewModel; 
     public ViewModelBase CurrentViewModel 
     { 
      get { return currentViewModel; } 
      set { SetProperty(ref currentViewModel, value); } 
     } 
} 

repository.LoadData():

Thread.Sleep(2500); 
return "some text"; 

LoadData()被调用作为一个按钮的命令

我在做什么错?如果将可见性绑定到MyCustomView的网格上,它可以工作,但这不是解决方案,因为我有很多视图,而我只想要在一个地方绑定MainWindow

+0

最可能的是IsContentVisible setter没有引发属性更改的事件。 – MajkeloDev

+0

@MajkeloDev嘿,只是调试,它是。在LoadData()方法中正确提升事件两次 – Mefhisto1

+1

这很奇怪。尝试把这个网格而不是将用户控制的测试里面一些虚拟的文本块什么的,所以你现在如果是IsContentVisible财产的问题,或者是相关的托管用户的一个问题控制 – MajkeloDev

回答

1

你试过了吗?

private Visbility isContentVisible = Visibility.Visible; 
public Visbility IsContentVisible 
{ 
    get { return isContentVisible; } 
    set 
    { 
     isContentVisible = value; 
     OnPropertyChanged("IsContentVisible"); 
    } 
} 
+0

是的,我已经尝试过。 – Mefhisto1

+1

你会在输出窗口中看到绑定错误吗? – Picco

+0

不管它是否工作,Property setter都是调用OnPropertyChanged方法的好地方。 – niksofteng