如何使用Silverlight MVVM模式正确连接网格上的可见性绑定?

时间:2012-06-06 17:49:19

标签: silverlight binding mvvm visibility

更具体地说,我做得对,因为它不起作用。我的ViewModel中有一个bool属性以及TextBlock的文本属性。如果我更改了文本属性,结果会立即显示在屏幕上。所以我知道正在倾听财产的变化。 visibility属性设置为使用bool-to-visibility转换器但该转换器永远不会被调用。我确定它只是数据绑定的某些部分,我做得不对,但我已经尝试了StackOverflow上的所有建议,以及手动设置绑定和其他一些事情。我在这个问题上有超过12个小时的时间,整个Silverlight / MVVM架构让我感到非常失望。而且我非常兴奋,我也想到了#34;。

详情:Silverlight 5.1.10144

App.xaml资源: <Application.Resources> <vidstreams:ManagementViewModel x:Key="managementViewModel"/> <vidstreams:VisibilityConverter x:Key="visConverter"/> </Application.Resources>

MyView.xaml DataContext:

<UserControl.DataContext>
    <Binding Source="{StaticResource managementViewModel}"/>
</UserControl.DataContext>

MyView.xaml网格可见性绑定:

<Grid x:Name="LayoutRoot" Background="Black">
    <Grid.RowDefinitions>
        <RowDefinition Height="60"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Grid ...
             Visibility="{Binding IsWaitingVisible, Mode=OneWay, Converter={StaticResource visConverter}}">...</Grid>
    <Button x:Name="test"
         Click="test_Click"
         Content="test visibility"
         HorizontalAlignment="Left"
         Margin="0,0,0,0"
             Grid.Row="1"
             VerticalAlignment="Top"/>
</Grid>

MyView.xaml.cs Instance属性和test_Click代码:

public ManagementViewModel DataContextObject
        {
            get
            {
                return (ManagementViewModel)App.Current.Resources["managementViewModel"];
            }
        }

    protected void test_Click(object sender, RoutedEventArgs e)
        {

            DataContextObject.IsWaitingVisibile = !DataContextObject.IsWaitingVisibile; //doesn't toggle the visibility or cause the converter to be hit
            DataContextObject.WaitingText = "Loading data..."; //works
        }

ManagementViewModel类内部:

public class ManagementViewModel : INotifyPropertyChanged
{
  public event PropertyChangedEventHandler PropertyChanged;
  protected void OnPropertyChanged(string propertyName)
  {
    var p = PropertyChanged;
    if (p != null)
    {
        p(this, new PropertyChangedEventArgs(propertyName));
    }
  }

  bool mIsWaitingVisible = true;
  public bool IsWaitingVisibile 
  {
    get { return mIsWaitingVisible; }
    set
    {
        mIsWaitingVisible = value;
        OnPropertyChanged("IsWaitingVisible");
    }
  }
  ...
}

我会在这里发布转换器代码,但它甚至没有被击中。无论如何,这是一个简单的转换器,就像在本网站的各个帖子中找到的其他转换器一样。

任何想法或建议 - 或者只是确认这可能是5中的某种回归错误? - 会非常感激。可能必须以不同方式设置可见性绑定指令。请记住,TextBlock工作正常:

<TextBlock x:Name="WaitingTextBlock"
           Text="{Binding WaitingText}" .../>

1 个答案:

答案 0 :(得分:1)

@GolfARama

您可以尝试使用此

可见性=&#34; {绑定IsWaitingVisible,Mode = TwoWay,Converter = {StaticResource visConverter}}&#34;&gt;