3

私は WPF アプリケーションを作成していますが、パフォーマンスが少し遅いので、解決しようとしています。実行すると、次のような種類のメッセージが大量に表示されます。

System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=(0); DataItem=null; target element is 'Control' (Name=''); target property is 'Visibility' (type 'Visibility')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=AreRowDetailsFrozen; DataItem=null; target element is 'DataGridDetailsPresenter' (Name=''); target property is 'SelectiveScrollingOrientation' (type 'SelectiveScrollingOrientation')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=HeadersVisibility; DataItem=null; target element is 'DataGridRowHeader' (Name=''); target property is 'Visibility' (type 'Visibility')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=ValidationErrorTemplate; DataItem=null; target element is 'Control' (Name=''); target property is 'Template' (type 'ControlTemplate')

ちょっとしたサンプル アプリケーションを作成すると、次のようになります。

<Window x:Class="bindingerrors.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:bindingerrors="clr-namespace:bindingerrors" Title="MainWindow">
    <Window.Resources>
        <bindingerrors:Thinger x:Key="Thing" />               
    </Window.Resources>
    <StackPanel>
        <DataGrid x:Name="TheGrid" ItemsSource="{Binding Stuff, Source={StaticResource Thing}}" AutoGenerateColumns="False" HeadersVisibility="Column">
            <DataGrid.Columns>
                <DataGridTextColumn Header="!" Binding="{Binding A, FallbackValue=''}" />
                <DataGridTextColumn Header="#" Binding="{Binding I, FallbackValue=''}" />              
                </DataGrid.Columns>
        </DataGrid>
    </StackPanel>
</Window>

そして、次のオブジェクト定義:

public class Thinger
{
    public ObservableCollection<ARow> Stuff { get; private set; }

    public Thinger()
    {
        //Fill up some bogus data
        string letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        int i = 0;
        Stuff = new ObservableCollection<ARow>();
        foreach (var letter in letters)
        {
            Stuff.Add(new ARow(letter.ToString(),i));
            i++;
        }
    }
}

public class ARow
{
    public string A { get; private set; }
    public int I { get; set; }

    public ARow(string a, int i)
    {
        A = a;
        I = i;
    }
}

実行すると、これらの拘束力のある問題が山ほど発生します。多くの WPF パフォーマンスに関する記事では、失敗したバインディングがパフォーマンスに深刻な影響を与える可能性があると主張しているため、これが多くの問題の原因であると思われます。

何が起こっている?これらの失敗したバインディングを削除するにはどうすればよいですか? 私が提供した例は、問題の兆候を示しながら作成できるのと同じくらい簡単ですが、うまくいくはずですよね? 違いがあれば、.net 4.0用に構築しています。

編集:サンプル コードをビルドしてみると、エラーが抑制される場合があります。Visual Studio のオプション -> デバッグ -> 出力ウィンドウ -> データバインディングで、「情報」に設定されていることを確認します。

Get many Binding "Information" in WPF output windowを見てきましたが、それについて何をすべきかについての情報はありません。

ありがとう

4

2 に答える 2

1

これらのエラーの一部を解消するために修正できることがいくつかあります。

  1. Stuffにはプライベートセッターがあるため、に設定する必要があり BindingModeますOneWay
  2. Aにはプライベートセッターがあるため、に設定する必要があり BindingModeますOneWay
  3. I値ではないフォールバック値がありintます

ただし、投稿したエラーと一致するものはありませんが、いくつかの観察結果があります

于 2013-02-22T05:01:36.153 に答える
0

すべてのバインドの問題を見つけるには時間がかかりますが、次の解決策は簡単です。

アプリケーション コンストラクターに次のコード行を入力するだけです。

System.Diagnostics.PresentationTraceSources.DataBindingSource.Switch.Level     =System.Diagnostics.SourceLevels.Critical;

上記の行をコンストラクターに追加すると、デバッガーはバインディング エラーを無視し、パフォーマンスが向上します。

お役に立てれば。

ありがとう、マイク。

于 2013-08-06T12:06:41.760 に答える