通过C#绑定不更新

时间:2018-01-12 09:41:55

标签: c# xaml mvvm binding uwp

我正在使用MVVM原则为UWP创建一个应用程序。

我有一个包含标准工具栏的页面,下面的ScrollView中的实际内容是动态的,具体取决于用户导航的位置;

<ScrollViewer>
        <StackPanel Orientation="Vertical">
            <ContentControl HorizontalAlignment="Stretch" 
                            VerticalAlignment="Stretch" 
                            Content="{x:Bind viewModel.Content}">
            </ContentControl>
        </StackPanel>
</ScrollViewer>

我绑定到该部分的内容的简化版本如下所示:

public class Content : StackPanel
{
    ContentViewModel ViewModel;
    TextBlock txtInformation;

    public Content()
    {
        Orientation = Orientation.Vertical;
        ViewModel = new ContentViewModel();                        
        txtInformation = new TextBlock();

        txtInformation.SetBinding(TextBlock.TextProperty,
                                  new Binding()
                                  {
                                      Mode = BindingMode.OneWay,
                                      Source = ViewModel.Item,
                                      Path = new 
                                      PropertyPath("Information"),
                                      TargetNullValue = "No information found"
                                  });

        Children.Add(txtInformation);
    }
}

最后,这里是内容视图模型的简化版本:

public class ContentViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    MyObject _item;

    public ContentViewModel()
    {
        Item = new MyObject()
        {
            Information = "Information goes here"
        };  
    }

    public MyObject Item
    {
        get
        {
            return _item;
        }
        set
        {
            _item = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Item"));
        }
    }
}

最初绑定似乎有效,因为当页面加载TextBlock时,“找不到信息”作为其文本值。但是当属性发生变化时,UI没有更新。

使用SetBinding()方法在C#中设置控件的绑定时,这似乎只是一个问题,而不是在XAML中使用{x:Bind}扩展名作为我的其他页面使用XAML进行正确的绑定更新。

不会抛出任何错误。

3 个答案:

答案 0 :(得分:0)

Content="{x:Bind ViewModel.Content, Mode=Oneway}">

x:Bind的标准模式是OneTime ...仅在开始时有效......

答案 1 :(得分:0)

而不是

txtInformation.SetBinding(TextBlock.TextProperty,
                              new Binding()
                              {
                                  Mode = BindingMode.OneWay,
                                  Source = ViewModel.Item,
                                  Path = new 
                                  PropertyPath("Information"),
                                  TargetNullValue = "No information found"
                              });

The Source&amp; PropertyPath属性应设置如下:

txtInformation.SetBinding(TextBlock.TextProperty,
                              new Binding()
                              {
                                  Mode = BindingMode.OneWay,
                                  Source = ViewModel,
                                  Path = new 
                                  PropertyPath("Item.Information"),
                                  TargetNullValue = "No information found"
                              });

感谢@ grek40建议我在示例应用中重新创建问题。它澄清了错误的来源。

答案 2 :(得分:-3)

试试这样。我认为INotifyPropertyChanged接口的实现有问题。

CREATE TABLE