【问题标题】:binding windows 8 textBlock in MVVM light在 MVVM 灯光中绑定 windows 8 textBlock
【发布时间】:2013-02-16 12:38:18
【问题描述】:

我遇到了 TextBlock/TextBox 绑定问题。 TextBlock 不显示属性的内容。当我调试我的应用程序时,属性有内容。你怎么能做到? Xaml。

<TextBlock HorizontalAlignment="Left" Margin="730,191,0,0" TextWrapping="Wrap" Text="{Binding XmlContentFile, Mode=TwoWay}"   VerticalAlignment="Top" Height="429" Width="465"/>

我在网上寻找简单的代码,但我没有找到代码。

代码属性

 public string XmlContentFile
        {
            get
            {
                return this.xmlContentFile;
            }
            set
            {
                this.xmlContentFile = value;

            }
        }

我的数据上下文

DataContext="{Binding Main, Source={StaticResource Locator}}">

方法加载 XML 文件到字符串变量

public async void  XmlContentLoad()
        {

            if (selectFile != null)
            {
                try
                {

                    StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
                    StorageFile storageFile = await storageFolder.GetFileAsync(selectFile);
                    xmlFileTextContent = await FileIO.ReadTextAsync(storageFile);



                }
                catch (Exception)
                {
                    throw new Exception("Bug");
                }
            }
        }

【问题讨论】:

标签: c# xaml windows-8 mvvm-light


【解决方案1】:

问题是您的 XmlContentFile 属性在更改时不会发出任何通知。您的 ViewModel 需要实现 INotifyPropertyChanged 并在任何属性发生更改时引发事件。

您的视图及其数据绑定很可能在 XmlContentLoad 完成之前设置和执行(它是异步的)。如果在加载数据之前绑定已经完成,那么再次发生绑定的唯一方法是属性引发它已更改的通知。

还值得指出的是,在您的 XmlContentLoad 方法中,您设置的是私有变量而不是公共属性。

xmlFileTextContent = await FileIO.ReadTextAsync(storageFile);

设置私有变量永远不会引发属性更改通知,即使您已连接设置器代码以引发通知。您需要更改 XmlContentLoad 以设置属性并在设置器中设置 OnPropertyChanged 通知(推荐),或者您需要在设置私有后调用 OnPropertyChanged变量(不推荐)。

希望对您有所帮助。

开发支持、设计支持和更多精彩即将推出:http://bit.ly/winappsupport

【讨论】:

  • 谢谢贾里德 ;)。我认为 MVVM 灯具有 INotifyPropertyChanged。干杯!
【解决方案2】:

确保您正确设置绑定源:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:WpfApplication1="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded_1" >
<Grid>
    <TextBlock Text="{Binding XmlContentFile, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="#FFF3A3A3"/>
</Grid>

并确保您在正确的位置设置属性值:

public partial class MainWindow : Window,INotifyPropertyChanged
{
    private string _xmlContentFile;
    public string XmlContentFile
    {
        get
        {
            return _xmlContentFile ;
        }
        set 
        { 
            _xmlContentFile = value;
            OnPropertyChanged("XmlContentFile");
        }
    }
    public MainWindow()
    {
        InitializeComponent();
    }


    private void Window_Loaded_1(object sender, RoutedEventArgs e)
    {
        XmlContentFile = "New Value !";
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

确实,这个答案不在 MVVM 中,但除了您需要将 DataContext 设置为 ViewModel 之外,不需要太多更改。

【讨论】:

  • 我看过类似的代码,但我更喜欢学习 MVVM。我可以在 MVVM 中做简单的事情吗?
  • 如果您使用 MVVMLight(强烈推荐),您只需将顶级页面的 DataContext 设置为 DataContext="{Binding Source={StaticResource Locator}, Path=Main}"和 : Text="{Binding XmlContentFile}" 如果你仍然不知道 DataContext 中的定位器是什么,那么你需要学习一些关于 MVVMLight 的知识
  • 我设置了你说的DataContext,但TextBlock不显示可变内容。另一个控件例如 ListView 到函数绑定。
猜你喜欢
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
相关资源
最近更新 更多