VS2017を使用しているUWPアプリケーションでオブジェクトをページにバインドできません。コレクションはバインドできますが、単一のオブジェクトはバインドできません。私のコード:uwpアプリケーションvs2017でバインドできません - スクロールしないListView
User.cs
using System.ComponentModel;
namespace Binding
{
public class User : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private string _name = "";
public User(string name)
{
Name = name;
}
public string Name
{
get { return _name; }
set { _name = value ?? ""; OnPropertyChanged(nameof(Name)); }
}
}
}
MainPage.xamlを
<Page
x:Class="Binding.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button
x:Name="addBtn"
Grid.Row="0"
Grid.Column="0"
Click="addBtn_Click"
Content="Add"/>
<ListBox
x:Name="UserList"
Grid.Row="1"
Grid.Column="0"
ScrollViewer.VerticalScrollBarVisibility="Auto"
ScrollViewer.VerticalScrollMode="Auto"
SelectionChanged="UserList_SelectionChanged"
Height="1000"
>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<TextBox
x:Name="NameTextBox"
Grid.Row="0"
Grid.Column="1"
TextChanged="NameTextBox_TextChanged"
Text="{x:Bind Path=UserViewModel.Name, Mode=TwoWay}"
/>
</Grid>
</Page>
MainPage.xaml.cs
using System.Collections.ObjectModel;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace Binding
{
public sealed partial class MainPage : Page
{
public ObservableCollection<User> _users { get; } = new ObservableCollection<User>();
public User UserViewModel { get; set; }
public MainPage()
{
InitializeComponent();
UserList.ItemsSource = _users;
}
private void addBtn_Click(object sender, RoutedEventArgs e)
{
_users.Add(new User("Name" + _users.Count));
}
private void UserList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (UserList.SelectedItem is User user)
{
UserViewModel = user;
//NameTextBox.Text = $"{user.Name}";
}
}
private void NameTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
//UserViewModel.Name = NameTextBox.Text;
}
}
}
私はuncomm場合次の2行のように、私が探している効果が得られます
private void UserList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (UserList.SelectedItem is User user)
{
UserViewModel = user;
//UNCOMMENTED
NameTextBox.Text = $"{user.Name}";
}
}
private void NameTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
//UNCOMMENTED
UserViewModel.Name = NameTextBox.Text;
}
しかし、これは私が必要としているものではありません。私が開発している実際のアプリケーションでは、UserViewModelインスタンスへの双方向バインディングが必要ないくつかのフィールドを持つフォームが存在します。私はフォーム上のすべての単一のフィールドについて、TextChangedイベントハンドラ(またはFocusLost、何でも)を使用してフォームをペーストしたくありません。
私の2番目の問題は、ListViewがスクロールしないことです。
ありがとうございます。
完璧で、ありがとう。 – user1325543