1

最初は、XAML で次のコードを使用していました。

<CollectionViewSource x:Name="cSource">
  <CollectionViewSource.Source>
    <Binding Source="{StaticResource NameOfXmlDataProvider}" XPath="letter"/>
  </CollectionViewSource.Source>
<CollectionViewSource>

しかし、バインディング オブジェクトを C# コードに保持して、xpath を動的に変更できるようにしたいと考えていました。現在、私はこのコードを持っています:

CollectionViewSource viewSource = this.FindResource("cSource") as CollectionViewSource;
Binding binding = new Binding( "Source" );
binding.Source = _xmlDataProvider;
binding.XPath = "/new/path/to/nodes";
BindingOperations.SetBinding( viewSource, CollectionViewSource.SourceProperty, binding );

これはコンパイルされ、不平を言うことはありませんが、呼び出されたときに空のリストになるだけです。Web で関連する例を見つけることができないようです。それらのほとんどはデータ プロバイダーを扱っていますが、バインディングを変更したいと考えています。

  • 誰でもこれを修正する方法を知っていますか?
  • または、これを行うより良い方法はありますか?
  • コレクションビューからバインディングオブジェクトを取得して変更したからでしょうか?
4

4 に答える 4

2

XAML で静的リソースにバインドする (yuk) か、動的にバインディングを変更する (yukkier) のではなく、変更できるものにバインドします。

<CollectionViewSource x:Name="cSource">
  <CollectionViewSource.Source>
    <Binding Source="{Binding MyDataProviderProperty}" XPath="{Binding MyDataXPathProperty}"/>
  </CollectionViewSource.Source>
<CollectionViewSource>

完全な MVVM に移行したくない場合は、ページのUserControl要素に名前を付けるだけで、ページの DataContext をページのコード ビハインド クラスElementNameにバインドし、それを使用して datacontext をバインドできます (唯一の制限はDataContext バインディングを UserControl にも置くことはできません (したがって、グリッドのように最初の子に配置します)。

<UserControl x:Class="BindingTests.BindingToSelfExample"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400" x:Name="MyViewClass">
    <Grid x:Name="LayoutRoot" Background="White" DataContext="{Binding ElementName=MyViewClass}">
        <TextBlock Text="{Binding SomePropertyOfTheCodeBehind}" Width="100" Height="20"/>
    </Grid>
</UserControl>

ここで、MyDataProviderProperty および MyDataXPath という分離コードに通知プロパティがある限り、それらを思いのままに変更できます。

于 2011-06-24T14:16:17.053 に答える
0

SetBinding()collViewのメソッドを使用する必要があります。次のようなものでなければなりませんcollView.SetBinding(CollectionViewSource.SourceProperty, binding)

詳細については、http://msdn.microsoft.com/en-us/library/ms752347.aspxを参照してください。

于 2011-06-22T15:33:54.560 に答える
0

質問のコードの問題はSource、バインディングにあります。したがって、機能するのは次のとおりです。

 Binding binding = new Binding();

コンストラクターがパラメーターと共に使用される場合、パラメーターはPathバインディングの として設定されます。バインディングの (追加の)XPathは、そのパスから使用されます。そのため、空の選択につながる XML で「ソース」を見つけようとしました。その後、xpath はノードの空のセットで動作していました。

そのため、コードからバインディングを使用することができます。

于 2011-06-27T10:14:32.277 に答える
0

これを試して:

ICollectionView cSource {get;set;}

コンストラクターで:

cSource = new CollectionViewSource{Source = "myDataSource"}.View;

次に、コレクション ビュー ソースを変更する必要がある場合:

cSource = new CollectionViewSource{Source = "newDataSource"}.View;

たとえば、データグリッドの場合は、次のように呼び出します。

DG.ItemsSource = cSource;
DG.Items.Refresh();

Datagrid には、更新されたソース データが表示されます。

于 2019-02-07T20:13:42.983 に答える