任何人都可以在以下方面提供帮助-一直在玩这个游戏,但我一生无法使其正常工作。

我有一个包含以下属性的 View 模型;

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可以正常工作,并且我得到一个Rule对象列表,其名称显示在lbRules中。

我遇到的麻烦是将SelectedRule属性绑定(bind)到lbRules的SelectedItem。我尝试将文本块的text属性绑定(bind)到SelectedRule,但它始终为null。
<TextBlock Text="{Binding Path=SelectedRule.Name}" />

我在输出窗口中看到的错误是:
BindingExpression路径错误:找不到“SelectedRule”属性。

谁能帮我这个绑定(bind)-我看不出为什么它不应该找到SelectedRule属性。

然后,我尝试将textblock的text属性更改为以下属性,该方法有效。问题是我想在ViewModel中使用SelectedRule。
<TextBlock Text="{Binding ElementName=lbRules, Path=SelectedItem.Name}" />

非常感谢您的帮助。

最佳答案

首先,您需要在 View 模型中实现INotifyPropertyChanged接口(interface),并在PropertyChanged属性的 setter 中引发Rule事件。否则,绑定(bind)到SelectedRule属性的控件将不会在更改后“知道”。

然后,您的XAML

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

如果此TextBlockListBoxItemTemplate之外,并且具有与DataContext相同的ListBox,则完全有效。

07-24 19:53