Windows 8.1 스토어 앱용 ListView 데이터 바인딩
-
20-12-2019 - |
문제
그래서 제가 만든 데스크톱 프로그램을 앱으로 옮기려고 합니다. Windows 8.1
사용하여 Visual Studio 2013
. Datagrid
이번 릴리스에서는 더 이상 사용되지 않으므로 이를 다음 버전으로 번역하려고 합니다. ListView
.이전에 사용했던 ListViews
다른 데스크톱 응용 프로그램에서는 많은 것이 변경된 것 같습니다.내가 겪고있는 문제는 ListView
내 데이터베이스에서.나는 다음을 통해 연결하고 있습니다 WCF Service
코드를 단계별로 실행해보면 올바른 데이터를 얻고 있다는 것을 알 수 있지만 ListView에 표시할 수는 없습니다.내가 선호하는 최종 결과는 편집 가능한 3개의 정보 열이 있는 '목록 보기'입니다.이전에는 ListView.View
그런 다음 GridView
거기에 열이 있습니다.그러나 그것은 나타난다 ListView.View
다음과 같이 더 이상 사용되지 않습니다. GridView.Columns
.
여기 내 xaml이 있습니다. ListView
<ListView x:Name="lvInventory" Grid.Row="2" Style="{StaticResource listViewStyle}" ItemsSource="{Binding}">
<ListView.ItemTemplate>
<DataTemplate>
<Grid Height="200" Width="200">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="tbName" Text="{Binding InventoryName}" Width="200" Foreground="#FF0E0D0D" />
<TextBox x:Name="tbQty" Grid.Column="1"/>
<TextBox x:Name="tbType" Grid.Column="2"/>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
내 코드 숨김에서는 목록 보기의 항목 소스를 할당합니다.
VMInventory inventory = new VMInventory();
inventory.GetList();
lvInventory.ItemsSource = inventory;
VMInventory
내꺼야 ViewModel
내가 데이터를 가져오는 곳은 어디입니까? WCF service
그리고 그것은 다음과 같습니다:
public async Task GetList()
{
this.connection = new InventoryModelEntities(new Uri(url));
var filteredList = from o in connection.Inventory
where o.Have == false
select o;
var query = await Task.Factory.FromAsync((filteredList as DataServiceQuery).BeginExecute(null, null),
(result) => (filteredList as DataServiceQuery).EndExecute(result)) as IEnumerable<Aurora.InventoryService.Inventory>;
this.inventoryList = query.ToList();
this.currentItem = 0;
this.onPropertyChanged("Current");
this.IsAtStart = true;
this.IsAtEnd = (inventoryList.Count == 0);
}
마지막 참고 사항으로 텍스트 상자를 Grid
그리고 내가 언제 DataBind
그것을 text="{Binding Current.InventoryName}"
성공적으로 바인딩할 수 있습니다.
해결책
내가 올바르게 이해했다면 UI는 ViewModel에 추가한 값으로 업데이트되지 않지만 UI에 일부 값을 추가하면 ViewModel에 반영됩니다.
이 경우 목록 대신 ObserableCollection을 사용하고, 매번 목록을 생성하는 경우 ViewModel에 INotifyPropertyChanged를 구현해야 합니다.
이 모든 작업을 수행했지만 여전히 업데이트되지 않는 경우 UI 스레드가 아닌 asy Task에서 목록을 생성합니다.Ui가 아닌 스레드에서 UI를 업데이트하려면 Dispatcher를 사용하여 UI 업데이트를 사용하세요.디스패처를 사용하여 UI가 아닌 스레드에서 UI를 업데이트하는 많은 예를 찾을 수 있습니다.