2012-04-18 9 views
1

データビュー用に複数のデータビューを作成しているときに、バインディングが新しいインスタンスに対して正しく機能しないという問題があります。これを整理するのを手伝ってください。WPFバインドとDataviewが動作しない

誰にもこの問題の解決策がありますか?

前のポストに多くの詳細については以下を参照してください:。

「我々は新しいデータビューinstances.Thisのために提起されていないDataRowViewにPropertyChangeイベントが発生していると、ADOのバグではなく、WPFアプリが作成した後のように見えます新しいDataView、WPFは、DataViewの唯一のメンバ(DataRowView)からイベントを変更するようにサブスクライブし、古いDataRowViewからのイベントを変更することを拒否します。名前列への影響は古いDataRowViewに影響し、WPFは新しいDataRowViewをリッスンしているので、WPFはそれについて聞くことはありません。事前に

おかげ..

コード:

<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; 

     } 
+1

何が起こるかを記載してください。 –

+0

いいえ、どこにコードがありますか... –

+0

詳細が必要な場合は、コードpart.pleaseを追加しました。 – Siva

答えて

1

あなたがBindingListCollectionViewやICollectionVを取るときに何が起こりますかあなたのものをフィルタリングするDataviewの代わりにiew?

EDIT:

私はそれを試して、次の作品:

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> 
+0

ありがとうございました。私は既にバインディングが正しく動作していません。 – Siva

+0

2番目と3番目のリストビューの名前または姓が変更されたときに反映される "バインディングラベル"列の値を確認します。 – Siva

+0

基本的なデータテーブル行を編集する限り、すべての変更は3つすべてのListviewに反映されます。私のために働いています。 – blindmeis

0

dt.AcceptChanges(); 

そしてそのdoesntの仕事ならば...各添加後にこれを試してみてください行フィルタをリセットする

var tempFilter = dt.DefaultView.RowFilter; 
    dt.DefaultView.RowFilter = string.empty; 
    dt.DefaultView.RowFilter = tempFilter; 
+0

働いていません。同じ結果。 – Siva

+0

等号でフィルタを設定しようとしましたか... "" FirstName = 'Siva' "'?それでもデータは表示されませんか? –

+0

ADO.netにはいくつか問題があるようです。 – Siva

関連する問題