【问题标题】:How do I properly wire up visibility binding on a grid using Silverlight MVVM pattern?如何使用 Silverlight MVVM 模式正确连接网格上的可见性绑定?
【发布时间】:2012-06-10 18:37:35
【问题描述】:

更具体地说,我做对了吗,因为它不起作用。我的 ViewModel 中有一个 bool 属性以及一个 TextBlock 的文本属性。如果我更改文本属性,结果会立即出现在屏幕上。所以我知道有些东西正在监听属性变化。可见性属性设置为使用布尔到可见性转换器,但该转换器永远不会被调用。我确信这只是数据绑定的一部分,我做得不对,但我已经尝试了 StackOverflow 上建议的所有内容,以及手动设置绑定和其他几件事。我在这个问题上花了超过 12 个小时,我对整个 Silverlight / MVVM 架构感到非常失望。我也很兴奋,“想通了”。

详细信息:Silverlight 5.1.10144

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

MyView.xaml 数据上下文:

<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 实例属性和 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}" .../>

【问题讨论】:

  • 只是快速跟进:使用 WPF,如果您在代码隐藏中设置 DataContext,而不是通过绑定,它就可以工作。如果有人真的在他们自己的应用程序上这样做,我很想看看如何。
  • 不确定是否直接从代码中复制粘贴,但 IsWaitingVisible 属性定义为 IsWaitingVisibile,属性名称末尾多了一个 I。检查绑定问题的一种简单方法是在运行时在 Visual Studio 的输出窗口中查找绑定错误。
  • 伟大的收获,杰夫。谢谢。

标签: silverlight binding mvvm visibility


【解决方案1】:

@GolfARama

你好,你可以试试这个

Visibility="{Binding IsWaitingVisible, Mode=TwoWay, Converter={StaticResource visConverter}}">

【讨论】:

  • 我做到了。直到我重命名了该属性,它才有所帮助。在测试属性名称理论之前,我一直在等到我的项目进入 Beta 版,但我会回复。它必须只是在编译期间挂起的文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 2015-09-17
  • 2010-12-21
  • 2011-12-04
  • 2015-02-05
  • 1970-01-01
相关资源
最近更新 更多