Vasile имеет это прямо в комментариях. XAML в приложениях Windows 8 не может связываться со статическими свойствами. XAML может связываться со стандартными свойствами следующим образом:
public string Name { get; set; }
Это (выше) будет связываться с equiv. от {Binding Mode=OneTime}
. Это потому, что обновления для повышения событий. В то же время вы можете использовать полностью evented свойства, как это:
string m_Name = default(string);
public string Name { get { return m_Name; } set { SetProperty(ref m_Name, value); } }
Это будет связывать в XAML, поддерживая любой режим вы указываете (OneTime
, OneWay
, TwoWay
). Это следует за рисунком INotifyPropertyChanged
и является довольно простым.
Я говорю все, чтобы сказать это. Эти два подхода - единственный способ привязки. Вы не можете привязываться к полю. Вы не можете привязываться к методу (пока). И вы не можете привязываться к статическому свойству. Если вы должны привязываться к статическому свойству, просто выставьте свое статическое свойство в стандартном свойстве в вашей модели просмотра.
Чтобы показать вам, что я говорю правду, рассмотреть этот код XAML (почти как у вас):
<ComboBox x:Name="MyCombo" ItemsSource="{Binding}" />
Если вы попытаетесь это сделать, он будет связывать штраф:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
this.MyCombo.DataContext = new MyModel().Items;
base.OnNavigatedTo(e);
}
public class MyModel
{
public MyModel()
{
foreach (var item in Enumerable.Range(1, 50))
Items.Add(item);
}
ObservableCollection<int> m_Items = new ObservableCollection<int>();
public ObservableCollection<int> Items { get { return m_Items; } }
}
Единственное различие между две части - static
. Так что даже нажатие значений так, как вы пытаетесь, не будет работать. Это потому, что вы привязываетесь непосредственно к статическому свойству.
Вот способ иметь static
и подвергать его таким образом он будет связываться:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
this.MyCombo.DataContext = new MyModel().Items;
base.OnNavigatedTo(e);
}
public class MyModel
{
public MyModel()
{
foreach (var item in Enumerable.Range(1, 50))
s_Items.Add(item);
}
private static ObservableCollection<int> s_Items = new ObservableCollection<int>();
public ObservableCollection<int> Items { get { return s_Items; } }
}
В приведенной выше коде, у меня есть значение статического в MyModel
классе, но у меня есть стандартное свойство разоблачения его , Поскольку это ObservableColelction
, свойство уже имеет значение для привязки, поэтому это может быть полная реализация. Таким образом, вы получаете static
и переплет. Имеют смысл?
Теперь к смущающей части.
Техника, которую вы используете для привязки в своем вопросе, должна работать. Связывание статического свойства с DataContext
, а затем привязка к нему в ItemsSource
произведениях. @ maad0 продемонстрировал, что это прекрасный подход. Итак, почему он не работает для вас.
Я полагаю, что все, что я могу сказать, это «Это не потому, что вы неправы». <blush />
У меня возникло соблазн удалить мой ответ, но я оставляю его только потому, что объяснение статической привязки может быть ценным для разработчиков, которые пытаются это сделать.
Проверьте свой код с этим
Это ваш метод CheckJson. Я добавил заявление отладчика, чтобы увидеть, действительно ли вы получаете какие-либо результаты. Попробуйте использовать этот образец в своем приложении и посмотрите, не сломается ли он. Если он не сломается, проблема заключается не в том, что у вас нет данных. Проблема как-то в вашей привязке. Хотя все выглядит хорошо для меня.
public static async void CheckJson(object sender, object e)
{
var client = new HttpClient();
client.MaxResponseContentBufferSize = 1024 * 1024;
try
{
var response = await client.GetAsync(new Uri("URI"));
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
var jobj = JObject.Parse(result);
var list = jobj.Children()
.Cast<JProperty>()
.Select(p => new ComponentGroup()
{
Name = p.Name,
Type = (string)p.Value["P1"],
Value = (string)p.Value["P2"]
})
.ToList();
// add this code
if (!_componentcollection.Any())
System.Diagnostics.Debugger.Break();
_componentcollection = new ObservableCollection<ComponentGroup>(list);
}
catch (HttpRequestException ex)
{
}
}
Хмм ... все статично в вашей виртуальной машине. Когда вы выполняете привязку в XAML, вы должны установить ItemsSource = {Binding ComponentCollection} (ObservableCollection), а в DataContext вам нужен экземпляр вашего компонента Component Data Source. Но поскольку у него есть статический метод, я не уверен, насколько хорошо он выполнит трюк ... – VasileF
@Vasile Marian Fălămaş, должен ли я сделать какой-либо метод экземпляра метода, а не статический? –
Вежливо отметить лучший/правильный ответ. –