2012-04-18 115 views
1

我正在面临的问题,当我创建多个数据表的数据视图然后绑定不能正常工作的新实例。 Pleae帮我解决这个问题....WPF绑定Dataview不工作

有没有人有解决这个问题?请参阅以下详细信息

上一篇:

“我们正在经历的DataRowView的propertyChange事件没有引发新的数据视图instances.This似乎是一个ADO的错误,不经过WPF应用程序创建一个。新的DataView,WPF订阅从DataView的唯一成员(DataRowView)更改事件,并取消订阅旧的DataRowView中的事件。然后ADO更改新的DataView而没有任何通知,将新的DataRowView替换为旧DataRowView。到名称列会影响旧的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; 

     } 
+1

请张贴代码并描述发生了什么。 – 2012-04-18 01:34:13

+0

是的,哪里的代码... – 2012-04-18 01:59:03

+0

我已经添加了代码part.please让我知道,如果你需要更多的细节 – Siva 2012-04-18 02:56:02

回答

1

,当你把一个BindingListCollectionView或ICollectionV会发生什么iew而不是Dataview来过滤你的东西?

编辑:

我尝试过了,并以下工作:

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%'"}); 

添加,修改和删除的作品。

编辑2我的示例代码:更新以满足您的要求。通过任何列表视图中的文本框进行编辑!

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

Thanks.I已经尝试绑定无法正常工作。 – Siva 2012-04-18 07:22:25

+0

检查反映您何时在第二个和第三个列表视图中更改名字或姓氏的wheather“绑定标签”列值。 – Siva 2012-04-18 07:25:42

+0

只要我编辑底层的数据表行,所有的变化都反映了所有3个Listviews。所以它为我工作。 – blindmeis 2012-04-18 09:14:31

0

每次添加后尝试......

dt.AcceptChanges(); 

如果这不工作然后重置行筛选器

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

不工作。相同的结果。 – Siva 2012-04-18 08:57:43

+0

你有没有尝试设置相等的过滤器......像......'“FirstName ='Siva'”'?它是否仍然不显示数据? – 2012-04-19 06:48:58

+0

它不工作。它似乎在ADO.net中有一些问题。 – Siva 2012-04-19 07:48:16