2016-08-10 51 views
-1

仮想化を使用するDataGridがあり、列の1つにComboBoxを含むDataGridTemplateColumnが使用されています。しかし、DataGridで左右にスクロールすると(ComboBox列を移動してからビューに移動する)、ComboBoxは選択を失います。WPF DataGrid ComboBoxテンプレート列がスクロール中に選択を失う

EnableColumnVirtualization = "False"に設定すると問題は解決しますが、明らかに列の仮想化は失われます。

仮想化が無効になっていないソリューションはありますか?

私はこの問題を示す簡単な解決策をまとめました。あなたがそれを実行し、本当に速く左から右にスクロールすると、ComboBoxが最終的に空になり、その周りに赤い枠線が表示されます。

XAML:背後に

<Window x:Class="SimpleReproTest.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded"> 
<Grid> 
    <DataGrid x:Name="MyGrid" AutoGenerateColumns="False" EnableColumnVirtualization="True" EnableRowVirtualization="True" 
       VirtualizingStackPanel.VirtualizationMode="Standard" VirtualizingStackPanel.IsVirtualizing="True"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="DummyColumn" Binding="{Binding Dummy}"></DataGridTextColumn> 
      <DataGridTextColumn Header="DummyColumn" Binding="{Binding Dummy}"></DataGridTextColumn> 
      <DataGridTextColumn Header="DummyColumn" Binding="{Binding Dummy}"></DataGridTextColumn> 
      <DataGridTextColumn Header="DummyColumn" Binding="{Binding Dummy}"></DataGridTextColumn> 
      <DataGridTextColumn Header="DummyColumn" Binding="{Binding Dummy}"></DataGridTextColumn> 
      <DataGridTextColumn Header="DummyColumn" Binding="{Binding Dummy}"></DataGridTextColumn> 
      <DataGridTextColumn Header="DummyColumn" Binding="{Binding Dummy}"></DataGridTextColumn> 
      <DataGridTextColumn Header="DummyColumn" Binding="{Binding Dummy}"></DataGridTextColumn> 
      <DataGridTemplateColumn> 
       <DataGridTemplateColumn.HeaderTemplate> 
        <DataTemplate> 
         <TextBlock Text="ComboBox Column"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.HeaderTemplate> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox ItemsSource="{Binding DummyItems}" 
            SelectedValue="{Binding DummySelection}" 
            SelectedValuePath="Key" 
            DisplayMemberPath="Value"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
      <DataGridTextColumn Header="DummyColumn" Binding="{Binding Dummy}"></DataGridTextColumn> 
      <DataGridTextColumn Header="DummyColumn" Binding="{Binding Dummy}"></DataGridTextColumn> 
      <DataGridTextColumn Header="DummyColumn" Binding="{Binding Dummy}"></DataGridTextColumn> 
      <DataGridTextColumn Header="DummyColumn" Binding="{Binding Dummy}"></DataGridTextColumn> 
      <DataGridTextColumn Header="DummyColumn" Binding="{Binding Dummy}"></DataGridTextColumn> 
      <DataGridTextColumn Header="DummyColumn" Binding="{Binding Dummy}"></DataGridTextColumn> 
      <DataGridTextColumn Header="DummyColumn" Binding="{Binding Dummy}"></DataGridTextColumn> 
      <DataGridTextColumn Header="DummyColumn" Binding="{Binding Dummy}"></DataGridTextColumn> 
      <DataGridTextColumn Header="DummyColumn" Binding="{Binding Dummy}"></DataGridTextColumn> 
      <DataGridTextColumn Header="DummyColumn" Binding="{Binding Dummy}"></DataGridTextColumn> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

コード:

using System.Collections.Generic; 
using System.Windows; 
using System.Collections.ObjectModel; 

namespace SimpleReproTest 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     ObservableCollection<DummyColumn> MyData; 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      MyData = new ObservableCollection<DummyColumn>(); 
      for (int i = 0; i < 50; i++) 
       MyData.Add(new DummyColumn()); 

      MyGrid.ItemsSource = MyData; 
     } 
    } 

    public class DummyColumn 
    { 
     public ObservableCollection<KeyValuePair<int, string>> DummyItems {get; set;} 
     public string Dummy { get; set; } 
     public int DummySelection { get; set; } 

     public DummyColumn() 
     { 
      Dummy = "..."; 
      DummySelection = 0; 
      DummyItems = new ObservableCollection<KeyValuePair<int,string>>(); 
      DummyItems.Add(new KeyValuePair<int,string>(0, "Item 0")); 
      DummyItems.Add(new KeyValuePair<int,string>(1, "Item 1")); 
     } 
    } 
} 

答えて

0

私の答えのキーポイントは、あなたは、単にUpdateSourceTriggerであなたのコンボのTextプロパティをバインドする必要があるということですがに等しいですプロパティが変更されました。

これが唯一の正しい解決策です。 他の無関係の詳細と混同しないでください。あなたがWPFをよく知っていれば(残念なことにごく少数の人々が)、UIプロパティの変更がUIオブジェクト自体に起因する場合、OnPropertyChanged(または同等の通知機能)が全く役に立たないことを認識しておく必要があります。

このXAML

<DataTemplate> 
    <ComboBox ItemsSource="{Binding DummyItems}" 
      SelectedValue="{Binding DummySelection}" 
      SelectedValuePath="Key" 
       Text="{Binding DummySel, UpdateSourceTrigger=PropertyChanged}" 
      DisplayMemberPath="Value"/> 
</DataTemplate> 

とのViewModel

private string dummySel; 
public string DummySel 
{ 
    get { return dummySel; } 
    set { dummySel = value; 
     //OnPropertyChanged(() => DummySel); 
    } 
} 
private int dummySelection; 
public int DummySelection { 
    get { return dummySelection; } 
    set { 
     dummySelection = value; 
     //OnPropertyChanged(()=>DummySelection); 
    } 
} 
で試してみてください
関連する問題