1

データテーブル用に複数のデータビューを作成しているときに問題に直面しており、新しいインスタンスに対してバインドが正しく機能しません。これを整理するのを手伝ってください....

この問題の解決策はありますか? 詳しくは下記をご参照ください

前の投稿:

" DataRowView の PropertyChange イベントが新しい Dataview インスタンスに対して発生していません。これは、WPF ではなく ADO のバグのようです。アプリが新しい DataView を作成した後、WPF は DataView の唯一のメンバー (DataRowView) から変更イベントをサブスクライブします。 , and unsubscribes to change events from the old DataRowView. その後、どういうわけか ADO は通知なしで新しい DataView を変更し、新しい DataRowView を古いものに置き換えます. 今、Name 列への変更は古い DataRowView に影響し、WPF はそれらについて決して聞きません。新しい DataRowView をリッスンしています。」

前もって感謝します..

コード :

<Window x:Class="WpfStudy.GridView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:local="clr-namespace:WpfStudy"
         Height="400" Width="500" Title="Binding Listview with Mulit ItemSource Options">
    <Window.Resources>
        <local:NameConverter  x:Key="NameConverter"/>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>

        <StackPanel>
            <Button Click="Button_Click">Click</Button>
            <ListView Name="ListviewALL" >
                <ListView.View>
                    <GridView>
                        <GridViewColumn Width="140" Header="Binding Label" >
                            <GridViewColumn.DisplayMemberBinding>
                                <MultiBinding Converter="{StaticResource NameConverter}">
                                    <Binding  Path="LastName" />
                                    <Binding  Path="FirstName" />
                                </MultiBinding>
                            </GridViewColumn.DisplayMemberBinding>
                        </GridViewColumn>

                        <GridViewColumn Width="140">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBox Name="FirstName" FontFamily="Lucida Console" Text="{Binding FirstName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Width="200" />
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                        <GridViewColumn Width="140">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBox Name="LastName" FontFamily="Lucida Console" Text="{Binding LastName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Width="200" />
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>


                    </GridView>
                </ListView.View>
            </ListView>

        </StackPanel>
        <ListView Name="Listview" Grid.Row="1">
            <ListView.View>
                <GridView>
                    <GridViewColumn Width="140" Header="Binding Label" >
                        <GridViewColumn.DisplayMemberBinding>
                            <MultiBinding Converter="{StaticResource NameConverter}">
                                <Binding  Path="LastName" />
                                <Binding  Path="FirstName" />
                            </MultiBinding>
                        </GridViewColumn.DisplayMemberBinding>
                    </GridViewColumn>

                    <GridViewColumn Width="140">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Name="FirstName" FontFamily="Lucida Console" Text="{Binding FirstName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Width="200" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Width="140">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Name="LastName" FontFamily="Lucida Console" Text="{Binding LastName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Width="200" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>


                </GridView>
            </ListView.View>
        </ListView>

        <ListView Name="Listview1" Grid.Row="2">
            <ListView.View>
                <GridView>
                    <GridViewColumn Width="140" Header="Binding Label" >
                        <GridViewColumn.DisplayMemberBinding>
                            <MultiBinding Converter="{StaticResource NameConverter}">
                                <Binding  Path="LastName" />
                                <Binding  Path="FirstName" />
                            </MultiBinding>
                        </GridViewColumn.DisplayMemberBinding>
                    </GridViewColumn>

                    <GridViewColumn Width="140">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Name="FirstName" FontFamily="Lucida Console" Text="{Binding FirstName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Width="200" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Width="140">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Name="LastName" FontFamily="Lucida Console" Text="{Binding LastName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Width="200" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>


                </GridView>
            </ListView.View>
        </ListView>



    </Grid>
</Window>

コンバーター:

namespace WpfStudy
{
    public class NameConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter,
            System.Globalization.CultureInfo culture)
        {

            StringBuilder sb=new StringBuilder();

            foreach(string val in values)
            {

                if (sb.Length != 0)
                    sb.Append(" ");

                    sb.Append(val);

            }

            return sb.ToString();
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter,
            System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

}

バインディング ソース

- i am binding datatable source with 3 list view with differnet dataview. if we create more view instance then two way binding is not working.xaml not getting updated from source.

  private void loadDatatable()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("FirstName");
            dt.Columns.Add("LastName");
            dt.Columns.Add("Userid");


            DataRow dr = dt.NewRow();
            dr[0] = "Siva";
            dr[1] = "Jagan";
            dr[2] = "JS";
            dt.Rows.Add(dr);

            DataRow dr1 = dt.NewRow();
            dr1[0] = "Raam";
            dr1[1] = "John";
            dr1[2] = "RJ";
            dt.Rows.Add(dr1);


            ListviewALL.ItemsSource = dt.DefaultView;

            dv1 = new DataView(dt);
            dv1.RowFilter = "FirstName like'S%'";


            dv2 = new DataView(dt);
            dv2.RowFilter = "FirstName like 'R%'";


            Listview.ItemsSource = dv1;
            Listview1.ItemsSource = dv2;

        }
4

2 に答える 2

1

Dataview の代わりに BindingListCollectionView または ICollectionView を使用してフィルター処理するとどうなりますか?

編集:

私はそれを試してみましたが、次のように動作します:

    public BindingListCollectionView View1 { get; set; }
    public BindingListCollectionView View2 { get; set; }

    View1 = new BindingListCollectionView(new DataView(Dt) { RowFilter = "FirstName like 'R%'" });
    View2 = new BindingListCollectionView(new DataView(Dt) { RowFilter = "FirstName like 'S%'"});

作品の追加、修正、削除。

EDIT2私のサンプルコード:要件を満たすように更新してください。どのリストビューでもテキストボックスを編集できます!

public class Viewmodel
{
    public DataTable Dt { get; set; }
    public BindingListCollectionView View1 { get; set; }
    public BindingListCollectionView View2 { get; set; }

    public Viewmodel()
    {
        Dt = new DataTable();
        Dt.Columns.Add("Name");
        Dt.Columns.Add("VorName");


        DataRow dr = Dt.NewRow();
        dr[0] = "Siva";
        dr[1] = "Jagan";
        Dt.Rows.Add(dr);

        DataRow dr1 = Dt.NewRow();
        dr1[0] = "Raam";
        dr1[1] = "John";
        Dt.Rows.Add(dr1);


        View1 = new BindingListCollectionView(new DataView(Dt) { RowFilter = "Name like 'R%'" });
        View2 = new BindingListCollectionView(new DataView(Dt){RowFilter = "Name like 'S%'"});

    }
}

window.xaml.cs

public partial class MainWindow : Window
{
    private Viewmodel _data;
    public MainWindow()
    {
        InitializeComponent();
        this._data = new Viewmodel();

        this.DataContext = _data;
    }
}

window.xaml

 <Window.Resources>
    <local:NameConverter  x:Key="NameConverter"/>
</Window.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="138*" />
        <ColumnDefinition Width="209*" />
        <ColumnDefinition Width="156*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="76*" />
        <RowDefinition Height="235*" />
    </Grid.RowDefinitions>     
    <ListView ItemsSource="{Binding Dt}" Grid.Column="0" Grid.Row="1">
        <ListView.View>
            <GridView>
                <GridViewColumn Width="140" Header="Binding Label" >
                    <GridViewColumn.DisplayMemberBinding>
                        <MultiBinding Converter="{StaticResource NameConverter}">
                            <Binding  Path="Name" />
                            <Binding  Path="VorName" />
                        </MultiBinding>
                    </GridViewColumn.DisplayMemberBinding>
                </GridViewColumn>
                <GridViewColumn Header="Name" > 
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Name="FirstName" FontFamily="Lucida Console" Text="{Binding Name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Width="200" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>    
                </GridViewColumn>
                <GridViewColumn Header="VorName" DisplayMemberBinding="{Binding VorName}">
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
    <ListView ItemsSource="{Binding View1}" Grid.Column="1" Grid.Row="1">
        <ListView.View>
            <GridView>
                <GridViewColumn Width="140" Header="Binding Label" >
                    <GridViewColumn.DisplayMemberBinding>
                        <MultiBinding Converter="{StaticResource NameConverter}">
                            <Binding  Path="Name" />
                            <Binding  Path="VorName" />
                        </MultiBinding>
                    </GridViewColumn.DisplayMemberBinding>
                </GridViewColumn>
                <GridViewColumn Header="Name"  > 
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Name="FirstName" FontFamily="Lucida Console" Text="{Binding Name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Width="200" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate> 
                </GridViewColumn>
                <GridViewColumn Header="VorName" DisplayMemberBinding="{Binding VorName}">
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
    <ListView ItemsSource="{Binding View2}" Grid.Column="2" Grid.Row="1">
        <ListView.View>
            <GridView>
                <GridViewColumn Width="140" Header="Binding Label" >
                    <GridViewColumn.DisplayMemberBinding>
                        <MultiBinding Converter="{StaticResource NameConverter}">
                            <Binding  Path="Name" />
                            <Binding  Path="VorName" />
                        </MultiBinding>
                    </GridViewColumn.DisplayMemberBinding>
                </GridViewColumn>

                <GridViewColumn Header="Name"  > 
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Name="FirstName" FontFamily="Lucida Console" Text="{Binding Name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Width="200" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate> 

                </GridViewColumn>
                <GridViewColumn Header="VorName" DisplayMemberBinding="{Binding VorName}">

                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>   
于 2012-04-18T06:28:57.293 に答える
0

追加するたびにこれを試してください...

  dt.AcceptChanges();

それでもうまくいかない場合は、行フィルターをリセットします

  var tempFilter = dt.DefaultView.RowFilter;
  dt.DefaultView.RowFilter = string.empty;
  dt.DefaultView.RowFilter = tempFilter;
于 2012-04-18T08:13:53.017 に答える