绑定窗口8文本块在MVVM灯光下
本文关键字:MVVM 窗口 文本 绑定 | 更新日期: 2023-09-27 17:59:52
我的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
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");
}
}
}
问题是您的XmlContentFile属性在更改时不会引发任何通知。ViewModel需要实现INotifyPropertyChanged,并在任何属性发生更改时引发事件。
您的视图及其数据绑定很可能是在XmlContentLoad完成之前进行设置和执行的(它是异步的)。如果绑定在加载数据之前已经完成,那么再次进行绑定的唯一方法是属性发出更改通知。
还值得指出的是,在XmlContentLoad方法中,您设置的是私有变量,而不是公共属性。
xmlFileTextContent = await FileIO.ReadTextAsync(storageFile);
设置私有变量永远不会引发属性更改通知,即使您已经连接了setter代码来引发通知。您需要更改XmlContentLoad来设置属性,并在setter中具有OnPropertyChanged通知(推荐),或者您需要在设置私有变量后调用OnPropertyChanged(不推荐)。
希望能有所帮助。
开发支持、设计支持和更多精彩内容:http://bit.ly/winappsupport
确保正确设置绑定源:
<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之外,不需要太多更改。