1

バインドされたリストボックスの外にボタンをバインドするにはどうすればよいですか?

このリストボックスには私の検索結果が含まれており、各検索結果には検索履歴アイテムを削除するための「X」ボタンがあります。

これが私のリストボックスのプレビューです ここに画像の説明を入力してください
「X」ボタンはアイテムにカーソルを合わせたときにのみ表示されます

これが私のXAMLです

<ListBox x:Name="listHistory" ItemsSource={Binding SearchHistory.SearchHistory} BorderThickness="0" Margin="0" Padding="0" HorizontalContentAlignment="Stretch">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <!-- this binds to a string in ObservableCollection<string> -->
                <TextBlock Text="{Binding }" />

                <!-- this should bind to SearchHistory.Command_DeleteHistoryItem -->
                <!-- currently, this Command="{Binding SearchHistory.Command_DeleteHistoryItem}" doesn't work
                     System.Windows.Data Error: 40 : BindingExpression path error: 'SearchHistory' 
                     property not found on 'object' ''String' (HashCode=-1127982548)'. 
                     BindingExpression:Path=SearchHistory.Command_DeleteHistoryItem; 
                     DataItem='String' HashCode=-1127982548); 
                     target element is 'Button' (Name=''); 
                     target property is 'Command' (type 'ICommand')
                -->
                <Button Command="{Binding SearchHistory.Command_DeleteHistoryItem}" Grid.Column="1" HorizontalAlignment="Right" x:Name="btnDeleteHistoryItem" Content="r" FontFamily="Marlett" Style="{DynamicResource ButtonStyle}" Visibility="Hidden" Opacity="0.75" />
            </Grid>

            <DataTemplate.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Visibility" TargetName="btnDeleteHistoryItem" Value="Visible" />
                </Trigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

これが私のViewModelです

public class ViewModel_SearchHistory : ViewModelBase
{
    ObservableCollection<string> _SearchHistory = new ObservableCollection<string>();
    public ObservableCollection<string> SearchHistory
    {
        get { return this._SearchHistory; }
        set
        {
            if (this._SearchHistory != value)
            {
                this._SearchHistory = value;
                base.RaisePropertyChanged("SearchHistory");
            }
        }
    }

    public ViewModel_SearchHistory()
    {
        this.Command_DeleteHistoryItem = new RelayCommand(DeleteHistoryItem);
    }

    public ICommand Command_DeleteHistoryItem
    {
        get;
        internal set;
    }

    public void DeleteHistoryItem()
    {
        Debug.WriteLine("blah");
    }
}

このエラーがある問題

"System.Windows.Dataエラー:40:BindingExpressionパスエラー:'SearchHistory'プロパティが'オブジェクト''' String'(HashCode = -1127982548)'に見つかりません。BindingExpression:Path = SearchHistory.Command_DeleteHistoryItem; DataItem ='String'( HashCode = -1127982548);ターゲット要素は'ボタン'(名前='');ターゲットプロパティは'コマンド'(タイプ'ICommand') "

これは、WPFがObservableCollection <string> SearchHistorySearchHistory.Command_DeleteHistoryItemを探していることを示しています。しかし、いいえ、 ObservableCollection <string> SearchHistoryではなく、 ViewModelでコマンドをバインドする必要があります。

このような新しいモデルを考えていました

public class Model_HistoryItemDetail
{
    public string Item { get; set; }
    public ICommand Delete { get; internal set; }

    public Model_HistoryItemDetail()
    {
        this.Delete = new RelayCommand(DeleteItem);
    }

    public void DeleteItem()
    {
    }
}

そして私のSearchHistoryObservableCollectionではこのように

ObservableCollection<Model_HistoryItemDetail> _SearchHistory = new ObservableCollection<Model_HistoryItemDetail>();
public ObservableCollection<Model_HistoryItemDetail> SearchHistory
{
    get { return this._SearchHistory; }
    set
    {
        if (this._SearchHistory != value)
        {
            this._SearchHistory = value;
            base.RaisePropertyChanged("SearchHistory");
        }
    }
}

問題は、そのようにした場合、どうすればアイテムを削除できるかということです。


それで、それを行うための最良の方法は何ですか?

4

1 に答える 1

2
<Button Command="{Binding DataContext.Search.Command_DeleteHistoryItem,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}"/>

ビジュアルツリーを上ってリストボックス自体への参照を取得するには、RelativeSourceを使用する必要があります。そうするとDataContext、ViewModelであるはずのリストボックスを取得できます。

于 2013-02-15T00:18:20.393 に答える