Поведение связывания WPF - PullRequest
       10

Поведение связывания WPF

1 голос
/ 18 ноября 2009

У меня есть такая страница ...

<Page x:Class="WPFTestRig.Page1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Page1">
<Grid>
    <StackPanel>
        <ComboBox Name="myBox" ItemsSource="{Binding Path=MyCollection}" DisplayMemberPath="Name" IsSynchronizedWithCurrentItem="True" 
                  SelectedItem="{Binding Path=SelectedEntryValue}" SelectedValuePath="Name" SelectedValue="{Binding Path=SelectedEntryValue}"/>
    </StackPanel>

</Grid>
</Page>

с кодом позади

 public partial class Page1 : Page
{
    private List<Entry> _myCollection;
    private string _selectedEntryValue;
    public Page1()
    {
        InitializeComponent();
        _myCollection = new List<Entry>();
        _myCollection.Add(new Entry { Name = "Test1", Id = 1 });
        _myCollection.Add(new Entry { Name = "Test2", Id = 2 });
        _myCollection.Add(new Entry { Name = "Test3", Id = 3 });

        _selectedEntryValue = "Test3";

        myBox.DataContext = this;
    }

    public List<Entry> MyCollection
    {
        get {
            return _myCollection;
        }
    }
    public string SelectedEntryValue
    {
        get {
            return _selectedEntryValue;
        }
        set { 
            _selectedEntryValue = value ;
        }
    }

}

public class Entry
{
    public string Name { get; set; }
    public int Id { get; set; }
}

когда я ставлю точку останова на свойство set свойства SelectedEntryValue, я вижу, что он вызывается дважды, один раз со строкой имени типа, например (MyTestApp.Entry), а затем фактическое выбранное значение

Может кто-нибудь указать, что я должен делать, чтобы это работало правильно?

большое спасибо

Ответы [ 2 ]

2 голосов
/ 18 ноября 2009

Ваша проблема в том, что вы случайно связали SelectedItem и SelectedValue.

Вы написали (переформатировали для удобства чтения):

<ComboBox Name="myBox" ... SelectedValuePath="Name" ...
  SelectedItem="{Binding Path=SelectedEntryValue}"
  SelectedValue="{Binding Path=SelectedEntryValue}" />

Удалите привязку SelectedItem, и вы получите ожидаемое поведение.

1 голос
/ 18 ноября 2009

Вы видите это поведение, потому что связываете его как с SelectedItem, так и с SelectedValue, поэтому оно выполняется дважды. При первом связывании кажется, что отображаемое свойство еще не используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...