0

自動拡張列を使用して単純な ListView を作成すると、最初の「バッチ」アイテムが追加されるだけで自動拡張されます。なぜこれが起こるのですか、それを修正する方法はありますか?

ObservableCollection (例を示します) を使用して、LstItems.Items に手動でアイテムを追加しようとしましたが、同じ動作です。初めて BtnAdd をクリックすると、期待どおりに自動拡張されますが、その後はそうではありません。

XAML:

    <ListView Margin="12,12,12,41" Name="LstItems">
        <ListView.View>
            <GridView>
                <GridViewColumn Width="100" Header="Row 1" DisplayMemberBinding="{Binding Path=Col1}" />
                <GridViewColumn Width="Auto" Header="Row 2" DisplayMemberBinding="{Binding Path=Col2}" />
            </GridView>
        </ListView.View>
    </ListView>

コード:

public partial class Window1 : Window
{
    private readonly ObservableCollection<MyData> _data = new ObservableCollection<MyData>();

    private const int NumRepeats = 2;
    private const int EnumerationIncrement = 3;

    private int _enumerationCount = 3;

    public Window1()
    {
        InitializeComponent();
        LstItems.ItemsSource = _data;
    }

    private void BtnAdd_Click(object sender, RoutedEventArgs e)
    {
        for (int i = 1; i <= NumRepeats; i++)
        {
            string data = String.Join(", ", Enumerable.Repeat("Test Data", _enumerationCount));
            _data.Add(new MyData { Col1 = "Test", Col2 = data });
            _enumerationCount += EnumerationIncrement;
        }
    }
}
4

2 に答える 2

1

リストビューのデータコンテキストは 1 つの項目 (MyData) です。これは偶然だと思いますか? datacontext を残して、代わりに Listview の itemSource を _data にバインドする必要があります

XAML

 <ListView Margin="12,12,12,41" Name="LstItems" ItemSource="{Binding _data}">
        <ListView.View>
            <GridView>
                <GridViewColumn Width="100" Header="Row 1" DisplayMemberBinding="{Binding Path=Col1}" />
                <GridViewColumn Width="Auto" Header="Row 2" DisplayMemberBinding="{Binding Path=Col2}" />
            </GridView>
        </ListView.View>
    </ListView>

コード:

public partial class Window1 : Window
{
    public ObservableCollection<MyData> _data = new ObservableCollection<MyData>();

    private const int NumRepeats = 2;
    private const int EnumerationIncrement = 3;

    private int _enumerationCount = 3;

    public Window1()
    {
        InitializeComponent();
    }

    private void BtnAdd_Click(object sender, RoutedEventArgs e)
    {
        for (int i = 1; i <= NumRepeats; i++)
        {
            string data = String.Join(", ", Enumerable.Repeat("Test Data", _enumerationCount));
            _data.Add(new MyData { Col1 = "Test", Col2 = data });
            _enumerationCount += EnumerationIncrement;
        }
    }
}

また、おそらくコードが期待どおりに機能しない主な理由を見つけました。Window1 コンストラクターで LstItems.ItemsSource をプッシュしています。ItemSource をバインドしていません。したがって、_data が更新されると、ItemSource はそれを認識しません。おそらく、DataBinding について学習せずに簡単に解決するには、次のようにします。

    private void BtnAdd_Click(object sender, RoutedEventArgs e)
    {
        for (int i = 1; i <= NumRepeats; i++)
        {
            string data = String.Join(", ", Enumerable.Repeat("Test Data", _enumerationCount));
            _data.Add(new MyData { Col1 = "Test", Col2 = data });
            _enumerationCount += EnumerationIncrement;
        }
        LstItems.ItemSource = _data;
    }

時間があれば、データバインディングについて学ぶことを強くお勧めします。

于 2014-08-06T13:02:12.543 に答える
0

私もこの行動を見たことがあります。最初のスクリーン ペイントのサイズのみを指定します。各ペイントのサイズを変更すると、多くのオーバーヘッドが発生します。また、ユーザーが列のサイズを変更した場合、変更内容はおそらく変更されません。2列目に残りのスペースを与えないのはなぜですか? あなたはコンバーターでそれを行うでしょう。

于 2014-08-06T22:16:12.640 に答える