7

Jestem trochę zdezorientowany, jak działa powiązanie danych podczas korzystania z tych typów.CompositeCollection/CollectionViewSource confusion

Czytałem, że nie można wykonać następujące czynności

public partial class Window1 : Window 
    { 
     public ObservableCollection<string> Items { get; private set; } 

     public Window1() 
     { 
      Items = new ObservableCollection<string>() { "A", "B", "C" }; 
      DataContext = this; 
      InitializeComponent(); 
     } 
    } 

<Window x:Class="WpfApplication25.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <ComboBox> 
     <ComboBox.ItemsSource> 
      <CompositeCollection> 
       <CollectionContainer Collection="{Binding Items}"/> 
      </CompositeCollection> 
     </ComboBox.ItemsSource> 
    </ComboBox> 
</Window> 

ponieważ CompositeCollection ma pojęcie datacontext i tak coś wewnątrz niego za pomocą wiązania musi ustawić właściwość Źródło. Takich jak:

<Window x:Class="WpfApplication25.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <Window.Resources> 
     <CollectionViewSource x:Key="list" Source="{Binding Items}"/> 
    </Window.Resources> 

    <ComboBox Name="k"> 
     <ComboBox.ItemsSource> 
      <CompositeCollection> 
       <CollectionContainer Collection="{Binding Source={StaticResource list}}"/> 
      </CompositeCollection> 
     </ComboBox.ItemsSource> 
    </ComboBox> 
</Window> 

Ale jak to działa? ustawia źródło na coś, ale to coś, w tym przypadku CollectionViewSource używa datacontext (ponieważ nie jawnie ustawia źródło).

A zatem, ponieważ "lista" jest zadeklarowana w zasobach systemu Windows, czy oznacza to, że pobiera Windows DataContext? W takim przypadku, dlaczego nie działają również poniższe?

<Window x:Class="WpfApplication25.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <Window.Resources> 
     <Button x:Key="menu" Content="{Binding Items.Count}"/> 
    </Window.Resources> 

    <ComboBox Name="k"> 
     <ComboBox.ItemsSource> 
      <CompositeCollection> 
       <ContentPresenter Content="{Binding Source={StaticResource menu}}"/> 
      </CompositeCollection> 
     </ComboBox.ItemsSource> 
    </ComboBox> 
</Window> 

Odpowiedz

4

masz rację CompositeCollection ma pojęcie datacontext więc nie dziedziczyć go od jego rodzica.

z MSDN:
CompositeCollection can contain items such as strings, objects, XML nodes, elements, as well as other collections. An ItemsControl uses the data in the CompositeCollection to generate its content according to its ItemTemplate. For more information about using ItemsControl objects to bind to collections, see the Binding to Collections section of the Data Binding Overview.

do Twojego pytania
But how is that working? it sets the source to something, but that something, in this case a CollectionViewSource uses a DataContext (as its not explicitly setting a source).

Chyba cię myśleć, tym Collection DependecyProperty może wiązać się z jakimkolwiek IEnumerable typu, więc nie ma znaczenia, w jaki sposób była kolekcja tworzone tak długo, jak długo jest tworzone i implementuje IEnumerable.
w twoim przypadku CVS dziedziczy DataContext z Okna, a następnie wiąże się z Items.

dotyczące swój drugi przykład to nie działa, ponieważ ContentPesenter potrzebuje DataContext pracować tak ponieważ może go odziedziczyć, mechanizm wiązania wystarczy ustawić się jako DataContext nawet jeśli próbowała wiążące zawartość Source przycisku, zapomniałeś aby ustawić ścieżkę, myślę, że właśnie dlatego została zignorowana. wszystko co musisz zrobić, to praca jest po prostu ustawić go tak:

<ContentPresenter Content="{Binding Source={StaticResource menu}, Path=Content}"/ 
+1

Dlaczego nie jest to coraz upvotes? upvote to! – Tuco

Powiązane problemy