RootObject.cs
public class RootObject
{
private const string api = "";
private const string mode = "json";
private const string url = "http://api.openweathermap.org/data/2.5/weather?q=";
public Coord coord { get; set; }
public void Get(string city)
{
JObject jsonData = JObject.Parse(new WebClient().DownloadString(url + city + "&appid=" + api + "&mode=" + mode));
coord = new Coord(jsonData.SelectToken("coord"));
}
}
Coord.cs
public class Coord
{
private double lon;
public double Lon
{
get { return lon; }
set { lon = value;}
}
private double lat;
public double Lat
{
get { return lat; }
set { lat = value;}
}
public Coord(JToken coorddata)
{
this.Lon = Convert.ToDouble(coorddata.SelectToken("lon"));
this.Lat = Convert.ToDouble(coorddata.SelectToken("lat"));
}
}
ViewModel.cs
public class ViewModel
{
public ICommand MyCommand { get; set; }
public ViewModel()
{
MyCommand = new RelayCommand(ExecuteMyMethod, CanExecuteMyMethod);
}
private string city;
public string City
{
get { return city; }
set { city = value; }
}
private bool CanExecuteMyMethod(object parameter)
{
if (string.IsNullOrEmpty(City))
{
return false;
}
else
{
if (City != "")
{
return true;
}
else
{
return false;
}
}
}
private void ExecuteMyMethod(object parameter)
{
RootObject a = new RootObject();
a.Get(City);
}
}
MainWindow.xaml
<Window.Resources>
<vm:ViewModel x:Key="viewModel"></vm:ViewModel>
</Window.Resources>
<Grid >
<StackPanel>
<StackPanel DataContext="{Binding Source={StaticResource viewModel}}">
<TextBox Width="100" Height="30" Text="{Binding City, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox>
<Button Width="100" Height="30" Command="{Binding MyCommand }">pussh</Button>
</StackPanel>
<StackPanel DataContext="{Binding Source={???}}">
<Label></Label>
<TextBox Width="100" Height="100" Text="{Binding Path=Lon}"></TextBox>
<TextBox Width="100" Height="50" Text="{Binding Path=Lat}"></TextBox>
</StackPanel>
</StackPanel>
</Grid>
我是MVVM中的新手。
我尝试将属性Lat
和Lon
绑定到XAML中的文本框(按钮点击后会显示Lat
和Lon
),已经使用DataContext
进行了测试ObjectDataProvider
,但它没有用。我想我忘了什么,但不知道应该是什么。
答案 0 :(得分:0)
如果希望在ViewModel / Model属性更改时更新Binding
,则需要阅读INotifyPropertyChanged interface,这是ViewModel和Models需要实现的界面。一旦您对INotifyPropertyChanged
的工作方式有了基本的了解,那么您必须决定是将Lat
和Lon
属性直接添加到ViewModel中,还是为您的第二个ViewModel创建第二个ViewModel RootObject
并绑定它。
另外,一个好的做法是将DataContext设置为页面的根元素(即:Window),如果未指定,则DataContext将由子项继承。
很遗憾,如果没有INotifyPropertyChanged
,您将无法使Binding
向Lat
和Lon
显示任何更新后的值。
请注意,您的RootObject a
目前在ExecuteMyMethod
结尾处被销毁,您可能希望在此更改逻辑以保留对a.Coord
值的引用不知。