5

CollectionViewSource を介して入力しているコンボボックスがあります。アイテムは、受信アイテム タイプ (この場合は ProjectViewModel) のデータ テンプレートを介して構築されます。これは、.NET 4.0 の WPF にあります。

私の window.resources では、次のように指定しました。

    <Style TargetType="{x:Type ComboBoxItem}">
        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
    </Style>

このスタイルにもかかわらず、私はまだ次のエラーが発生しています:

System.Windows.Data エラー: 4 : 参照 'RelativeSource FindAncestor、AncestorType='System.Windows.Controls.ItemsControl'、AncestorLevel='1'' でバインディングのソースが見つかりません。BindingExpression:Path=Horizo​​ntalContentAlignment; DataItem=null; ターゲット要素は 'ComboBoxItem' (Name='') です。ターゲット プロパティは 'Horizo​​ntalContentAlignment' (タイプ 'Horizo​​ntalAlignment') です

System.Windows.Data エラー: 4 : 参照 'RelativeSource FindAncestor、AncestorType='System.Windows.Controls.ItemsControl'、AncestorLevel='1'' でバインディングのソースが見つかりません。BindingExpression:Path=VerticalContentAlignment; DataItem=null; ターゲット要素は 'ComboBoxItem' (Name='') です。ターゲット プロパティは 'VerticalContentAlignment' (タイプ 'VerticalAlignment') です

ComboBox 要素にも Horizo​​ntal および Vertical ContentAlignment を指定しましたが、役に立ちませんでした。アイテムが正しく表示されるため、これは深刻な問題ではありません。ただし、デバッグ時にウィンドウを閉じると約 10 秒の遅延が発生し、約 4000 のエラー メッセージが出力ウィンドウに出力されます (正当なバインディング エラーを検出するには、このウィンドウを開く必要があります。

エラーを正しく読み取れていない可能性があります。バインディングの有効なソースが見つからないのはなぜですか? 私の知る限り、ComboBox と CollectionViewSource の使用方法は、その意図に沿っています。

4

4 に答える 4

5

自分のプログラムでこの問題を解決したと思っていましたが、断続的にポップアップし続けることがわかりました。最後に、問題の原因を突き止めることができました。

に裏打ちされたコンボボックスを使用していて、イベント キューにICollectionView2 つ以上のcollectionView.Refresh()呼び出しをスタックすると (たとえば、2 つの異なるクリーンアップ操作のために refresh を 2 回呼び出す)、バインディング エラー スパムが生成されます。追加のRefresh()呼び出しごとにコンボボックスの各要素。このバインド エラーは、コンボ ボックスを少なくとも 1 回開いた後にのみ発生します。

特定のイベントに対して 1 回だけ呼び出すように書き換えるとRefresh()、バインド エラーが発生しなくなります。

于 2015-12-03T20:02:38.967 に答える
3

私はこの問題に2日間苦労したことを述べたいと思います. 最も一般的に提案されている解決策 (Horizo​​ntal/VerticalContentAlignment スタイルを要素に追加したり、App.xaml に追加したりする) では、常に問題が解決するとは限りません。

最終的に、私は自分自身の状況に特有の何かを発見しました - それが誰かの助けになることを願っています: FilterEventHandler を使用している場合は、再購読する前に購読を解除しないでください!

私の古いコードは、チャネル フィルター (UpdateCorporatesList を呼び出す) を変更するたびに、「データ エラー 4」メッセージを生成し続けました。

// This code generates errors
private void UpdateCorporatesList()
{
    this.CorporatesViewSource.Filter -= new FilterEventHandler(ApplyCorporateFilter);

    if (this.ChannelFilter != null)
    {
        this.CorporatesViewSource.Filter += new FilterEventHandler(ApplyCorporateFilter);
    }
    else
    {
        this.CorporateFilter = null;
    }
}

private void ApplyCorporateFilter(object sender, FilterEventArgs e)
{
    SalesCorporate customer = e.Item as SalesCorporate;
    var currentChannel = this.Channels.FirstOrDefault(x => x.ID == this.ChannelFilter).Description;
    if ((customer.ID != null) && (customer.Channel != currentChannel))
    {
        e.Accepted = false;
    }
}

...そのため、毎回 FilterEventHandler を再サブスクライブするように変更し、代わりに、イベント処理メソッドの Channel Filter に null のチェックを入れました。

// This code works as intended
private void UpdateCorporatesList()
{
    this.CorporatesViewSource.Filter += new FilterEventHandler(ApplyCorporateFilter);

    if (this.ChannelFilter == null)
    {
        this.CorporateFilter = null;
    }
}

private void ApplyCorporateFilter(object sender, FilterEventArgs e)
{
    var currentChannel = this.Channels.FirstOrDefault(x => x.ID == this.ChannelFilter);
    if (currentChannel.ID == null)
    {
        return;
    }

    SalesCorporate customer = e.Item as SalesCorporate;
    if ((customer.ID != null) && (customer.Channel != currentChannel.Description))
    {
        e.Accepted = false;
    }
}

出来上がり!もうエラーはありません:-)

于 2013-10-22T08:30:01.860 に答える
1

このエラーに数時間苦労し、Google のすべての解決策を試しましたが、これだけが機能し、コンボボックス スタイルから OverridesDefaultStyle プロパティ行を削除しました。

// before
<Style x:Key="{x:Type ComboBoxItem}" TargetType="{x:Type ComboBoxItem}">
    <Setter Property="SnapsToDevicePixels" Value="true" />
    <Setter Property="OverridesDefaultStyle" Value="true" />

// after
<Style x:Key="{x:Type ComboBoxItem}" TargetType="{x:Type ComboBoxItem}">
    <Setter Property="SnapsToDevicePixels" Value="true" />

データグリッド セル内のコンボボックスにスタイル テンプレートを使用する https://docs.microsoft.com/en-us/dotnet/desktop/wpf/controls/combobox-styles-and-templates?view=netframeworkdesktop-4.8

于 2021-05-25T20:41:12.583 に答える