MainPage.xaml中
<TextBlock Text="{Binding Pathname, Source={StaticResource ViewModel}, Mode=OneWay}" />
App.xaml
<ResourceDictionary>
<vm:InspectViewModel x:Key="ViewModel" />
</ResourceDictionary>
ViewModel
private string _pathname = null;
public string Pathname
{
get { return _pathname; }
set
{
if (_pathname != value)
{
_pathname = value;
RaisePropertyChanged("Pathname");
}
}
}
public void UpdatePathname(string path)
{
Pathname = path;
}
MainPage CodeBehind
private void lazyNavTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
InspectViewModel vm = new InspectViewModel();
var path = view.GetPath().ToArray();
string pathname = null;
// to figure out what the pathname is
for (int i = 0; i < path.Count(); i++)
{
TreeList treeItem = (TreeList)path[i].Key;
if (i == path.Count()-1)
pathname = pathname + treeItem.Name;
else
pathname = pathname + treeItem.Name + " : ";
}
vm.UpdatePathname(pathname);
}
绑定的TextBlock没有显示任何内容,nada,zip。路径名shource正在正确更改,但是当我在更改时触发INotifyPropertyChanged事件时似乎没有任何事情发生。
我确信我错过了一些非常明显但我无法弄明白的东西!
答案 0 :(得分:4)
您正在创建ViewModel的2个实例:
InspectViewModel vm = new InspectViewModel()
中,这是修改后的实例)您应该使用ViewModel的单个实例,例如
var vm = (InspectViewModel)Application.Current.Resources["ViewModel"];
而不是在MainPage代码隐藏中创建它。
答案 1 :(得分:2)
这是因为您每次都在lazyNavTree_SelectedItemChanged中从viewmodel创建一个实例。你应该只使用一个。
答案 2 :(得分:0)
看起来你错过了约束中的Path,试试;
Text="{Binding Path=Pathname, Source={StaticResource ViewModel}, Mode=OneWay}"
编辑:显然这不是问题,但保留这个答案,因为xhedgepigx提供了一个有用的链接作为下面的评论。