none
Баг с биндингом к DataView в WPF - проголосуйте, плиз RRS feed

  • Вопрос

  • Создал тему в этом разделе - выбор, увы, небольшой :)

    Сейчас веду переписку с товарищами из WPF Team и ADO Team по поводу бага с биндингом к DataView в WPF.

    Ссылки:

    http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/33442f0d-96a2-402c-91c4-d4c7b991c93a
    и
    http://social.msdn.microsoft.com/forums/en-US/wpf/thread/737889e6-6315-4d72-9563-8104b5e0429f/

    Обе стороны признают, что да, баг есть, но не мы в этом виноваты и вообще, что вы от нас хотите?
    Делу немало мешает мой английский, точнее его отсутствие. Переписка тянется с апреля и подвижек увы не предвидится.

    Пожалуйста, подтвердите, что такой баг действительно есть и что его надо бы починить.

    Ссылка для голосования: https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=339740&SiteID=212

    Да, если кто-то может рассказать, как можно добиться от товарищей более-менее оперативной реакции - вэлкам.

    Собственно issue description:

    Есть две DataTables ("Master" и "Details"), DataRelation  между ними ("MDRelation") по первичным ключам каждой таблицы (простая связка 1-к-1).

    Создаём два CollectionViewSource, настраиваем биндинг (в реальной жизни ресурсы живут в отдельном файле - не суть важно).

      <Window.Resources> 
        <CollectionViewSource x:Key="masterSource" /> 
        <CollectionViewSource x:Key="detailsSource" Source="{Binding Source={StaticResource masterSource}, Path=MDRelation}" /> 
      </Window.Resources>  


    Для masterSource создаём новый DataView // не будем обсуждать, почему так. Так надо

    DataView v = new DataView(dataSet.Tables[0]);  
    ((CollectionViewSource)Resources["masterSource"]).Source = v; 

    Теперь биндим ListBox к masterSource и показываем в нём details (доступ через MDRelation):

    <ListBox DataContext="{DynamicResource masterSource}" ItemsSource="{Binding}" DisplayMemberPath="MDRelation/Name"/> 

    и биндим TextBox к detailsSource:

    <TextBox DockPanel.Dock="Top" DataContext="{DynamicResource detailsSource}" Text="{Binding Name, UpdateSourceTrigger = PropertyChanged}"/> 

    Сначала всё работает как и ожидается, TextBox синхронизируется с ListBox'ом. Но, как только я поменяю источник у masterSource:

    DataView v = new DataView(dataSet.Tables[0]);  
    ((CollectionViewSource)Resources["masterSource"]).Source = v; 

    Биндинг перестаёт работать, стоит только выбрать  другой элемент в ListBox

    Как чинить?

    Window1.xaml:

    <Window x:Class="MDBinding.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="BindingSample" Width="618" Height="382">  
      <Window.Resources> 
        <Style x:Key="SomeSpacing">  
          <Setter Property="FrameworkElement.Margin" Value="6" /> 
        </Style> 
        <CollectionViewSource x:Key="masterSource" /> 
        <CollectionViewSource x:Key="detailsSource" Source="{Binding Source={StaticResource masterSource}, Path=MDRelation}" /> 
      </Window.Resources> 
      <DockPanel LastChildFill="True" Style="{DynamicResource SomeSpacing}">  
     
        <TextBlock DockPanel.Dock="Top" Text="Read me!" /> 
     
        <Border DockPanel.Dock="Top" BorderBrush="Black" BorderThickness="0.5" Padding="3" Style="{DynamicResource SomeSpacing}">  
          <TextBlock TextWrapping="Wrap">  
            <TextBlock.Inlines> 
              <Bold>Insructions:</Bold> 
              <LineBreak /> 
              <LineBreak /> 
              1: Click <Hyperlink Click="ResetClick"><Bold>here</Bold></Hyperlink> to replace data.  
              Edit text below. Bining is correct - all works OK.  
              <LineBreak /> 
              <LineBreak /> 
              2: Click <Hyperlink Click="SetSourceClick">here</Hyperlink> to replace dataview <Bold>without</Bold> repacing data.  
              Edit text below. Data is <Bold>out of sync</Bold> now.  
              <LineBreak /> 
              <LineBreak /> 
              3: GOTO 1: )  
            </TextBlock.Inlines> 
          </TextBlock> 
        </Border> 
     
        <TextBlock DockPanel.Dock="Top" Text="Edit me!" /> 
        <TextBox DockPanel.Dock="Top" DataContext="{DynamicResource detailsSource}" Text="{Binding Name, UpdateSourceTrigger = PropertyChanged}" Style="{DynamicResource SomeSpacing}" /> 
     
        <TextBlock DockPanel.Dock="Top" Text="Select me!" /> 
        <ListBox DataContext="{DynamicResource masterSource}" ItemsSource="{Binding}" DisplayMemberPath="MDRelation/Name" Style="{DynamicResource SomeSpacing}" /> 
      </DockPanel> 
    </Window> 
     


    Window1.xaml.cs

    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
    using System.Windows;  
    using System.Windows.Controls;  
    using System.Windows.Data;  
    using System.Windows.Documents;  
    using System.Windows.Input;  
    using System.Windows.Media;  
    using System.Windows.Media.Imaging;  
    using System.Windows.Navigation;  
    using System.Windows.Shapes;  
    using System.Data;  
     
    namespace MDBinding  
    {  
      public partial class Window1: Window  
      {  
        private DataSet dataSet;  
     
        public Window1()  
        {  
          InitializeComponent();  
        }  
     
        private void ResetDataSet()  
        {  
          dataSet = new DataSet();  
     
          DataTable masterTable = new DataTable("Master");  
          masterTable.Columns.Add("ID"typeof(int));  
          masterTable.Columns[0].Unique = true;  
          masterTable.Columns.Add("Name"typeof(string));  
     
          DataTable detailsTable = new DataTable("Details");  
          detailsTable.Columns.Add("ID"typeof(int));  
          detailsTable.Columns[0].Unique = true;  
          detailsTable.Columns.Add("Name"typeof(string));  
     
          dataSet.Tables.Add(masterTable);  
          dataSet.Tables.Add(detailsTable);  
     
          dataSet.Relations.Add("MDRelation", masterTable.Columns[0], detailsTable.Columns[0], true);  
        }  
     
        private void RefillDataSet()  
        {  
          dataSet.Clear();  
          for (int i = 0; i < 5; i++)  
          {  
            dataSet.Tables[0].Rows.Add(i, "Master #" + i);  
            dataSet.Tables[1].Rows.Add(i, "Detail #" + i);  
          }  
        }  
          
        private void SetSource()  
        {  
          DataView v = new DataView(dataSet.Tables[0]);  
     
          ((CollectionViewSource)Resources["masterSource"]).Source = v;  
        }  
     
        private void SetSourceClick(object sender, RoutedEventArgs e)  
        {  
          SetSource();  
        }  
        private void ResetClick(object sender, RoutedEventArgs e)  
        {  
          ResetDataSet();  
     
          RefillDataSet();  
     
          SetSource();  
        }  
      }  
    }  
     
    • Перемещено Tagore Bandlamudi 2 октября 2010 г. 1:10 MSDN Forums consolidation (От:Visual Studio - отзывы и пожелания)
    23 декабря 2008 г. 3:15