2017-11-03 17 views
0

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がスクロールしないことです。

ありがとうございます。

答えて

1

バインドを使用してTextBoxUserViewModelにバインドすることができます。 PropertyChangedUpdateSourceTriggerに設定することができます。

UpdateSourceTriggerPropertyChangedに設定すると、バインディングターゲット値が変更されるたびにバインドソースが更新されます。これはバインディングシステムによって自動的に検出されます。

x:BindにはUpdateSourceTriggerプロパティはありません。フォーカスが失われた場合にのみトリガーされます。例えば

:背後

<TextBox 
    x:Name="NameTextBox" 
    Grid.Row="0" 
    Grid.Column="1" 
    TextChanged="NameTextBox_TextChanged" 
    Text="{Binding Name,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 

コード:

private void UserList_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (UserList.SelectedItem is User user) 
    { 
     UserViewModel = user; 
     NameTextBox.DataContext = UserViewModel; 
    } 
} 

あなたのコードを形成する、あなたはListBoxHeight = "1000" を設定しています。アイテムの高さが1000より大きい場合、ListBoxをスクロールすることができます。そうでない場合は、スクロールできません。 Heightを削除できるはずです。

+0

完璧で、ありがとう。 – user1325543

関連する問題