選択 - リストボックスselectedItemへのWPFバインディング




wpf listview 複数 選択 (4)

itemsourceをコレクションに設定するので、テキストボックスはそのコレクション内の個々のアイテムに関連付けられます。 2つのリストボックスを持つマスターディテールフォームを作成しようとした場合、このシナリオでは選択したアイテムプロパティが便利です。 2番目のリストボックスのitemsourceを子コレクションのルールにバインドします。 つまり、選択した項目は、ソースが変更されたコントロールの外に、内部コントロール(データ・テンプレート内のものはすでに変更を認識しています)を警告します。

あなたの質問に答えるyesほとんどの状況でitemsourceを設定することは、コントロールのdatacontextを設定することと同じです。

誰もが次のものを手伝ってもらえますか?これについては遊んでいますが、私の人生ではそれがうまくいくわけではありません。

私は、次のプロパティを含むビューモデルを持っています。

public ObservableCollection<Rule> Rules { get; set; }
public Rule SelectedRule { get; set; }

私のXAMLで私は持っている。

<ListBox x:Name="lbRules" ItemsSource="{Binding Path=Rules}" 
         SelectedItem="{Binding Path=SelectedRule, Mode=TwoWay}">
<ListBox.ItemTemplate>
    <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="Name:" />
                <TextBox x:Name="ruleName">
                    <TextBox.Text>
                        <Binding Path="Name" UpdateSourceTrigger="PropertyChanged" />
                    </TextBox.Text>
                </TextBox>
            </StackPanel>
    </DataTemplate>
</ListBox.ItemTemplate>

ItemsSourceはうまくいき、lbRulesに名前が表示されたRuleオブジェクトのリストを取得します。

問題は、SelectedRemプロパティをlbRulesのSelectedItemにバインドすることです。 TextRockのTextプロパティをSelectedRuleにバインドしようとしましたが、常にnullです。

<TextBlock Text="{Binding Path=SelectedRule.Name}" />

出力ウィンドウに表示されるエラーは次のとおりです。BindingExpression path error: 'SelectedRule'プロパティが見つかりません。

誰もこのバインディングで私を助けることができます - 私はそれがなぜSelectedRuleプロパティを見つけるべきではないのか分かりません。

テキストブロックのテキストプロパティを変更してみました。 問題は、ViewModelでSelectedRuleを使用したいのですか?

<TextBlock Text="{Binding ElementName=lbRules, Path=SelectedItem.Name}" />

あなたの助けをありがとう。


Ruleのコンテキストで作業しているDataTemplate内部には、 SelectedRule.Nameバインドできない理由があります。 Ruleそのようなプロパティはありません。 ViewModelである元のデータコンテキストにバインドするには、次のように記述します。

<TextBlock Text="{Binding ElementName=lbRules, Path=DataContext.SelectedRule.Name}" />

更新: SelectedItemプロパティのバインディングに関して、それは完全に有効と見えます、私は私のマシンで同じを試して、それは正常に動作します。 ここに私の完全なテストアプリです:

XAML:

<Window x:Class="TestWpfApplication.ListBoxSelectedItem"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="ListBoxSelectedItem" Height="300" Width="300"
    xmlns:app="clr-namespace:TestWpfApplication">
    <Window.DataContext>
        <app:ListBoxSelectedItemViewModel/>
    </Window.DataContext>
    <ListBox ItemsSource="{Binding Path=Rules}" SelectedItem="{Binding Path=SelectedRule, Mode=TwoWay}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="Name:" />
                    <TextBox Text="{Binding Name}"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Window>

コードの背後にある:

namespace TestWpfApplication
{
    /// <summary>
    /// Interaction logic for ListBoxSelectedItem.xaml
    /// </summary>
    public partial class ListBoxSelectedItem : Window
    {
        public ListBoxSelectedItem()
        {
            InitializeComponent();
        }
    }


    public class Rule
    {
        public string Name { get; set; }
    }

    public class ListBoxSelectedItemViewModel
    {
        public ListBoxSelectedItemViewModel()
        {
            Rules = new ObservableCollection<Rule>()
            {
                new Rule() { Name = "Rule 1"},
                new Rule() { Name = "Rule 2"},
                new Rule() { Name = "Rule 3"},
            };
        }

        public ObservableCollection<Rule> Rules { get; private set; }

        private Rule selectedRule;
        public Rule SelectedRule
        {
            get { return selectedRule; }
            set
            {
                selectedRule = value;
            }
        }
    }
}

ヨコダーは正しいですが、

DataTemplate内で、 DataContextは現在処理中のRule設定されます。

DataContextの親にアクセスするには、バインディングでRelativeSourceを使用することも検討できます。

<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ____Your Parent control here___ }}, Path=DataContext.SelectedRule.Name}" />

RelativeSource詳細はこちらをご覧ください:

http://msdn.microsoft.com/en-us/library/system.windows.data.relativesource.aspx


私にとっては、通常、この質問のような2深度のプロパティをバインドするために、 DataContext一緒に使用します。

<TextBlock DataContext="{Binding SelectedRule}" Text="{Binding Name}" />

または、私はElementNameを使用ElementNameことを好みます。なぜなら、ビューコントロールでのみバインディングが達成されるからです。

<TextBlock DataContext="{Binding ElementName=lbRules, Path=SelectedItem}" Text="{Binding Name}" />





selecteditem