------- ИЗМЕНИТЬ------
Итак, я решил, что мой код правильный, как и фрагменты кода из всех ваших ответов. Спасибо за это. Моя проблема в том, что мой dev-machine работает под управлением .NET4.5, который ведет себя по-другому! Та же самая программа (скомпилированная с .NET4.0) корректно работает на машине с .NET4.0, но не на машине с .NET4.5!
Итак, вот мой пересмотренный вопрос а>.
------- ИЗМЕНИТЬ------
Во-первых, простой пример двусторонней привязки поля со списком к моему контексту данных:
Посмотреть модель:
public class MainWindowViewModel
{
public List<String> MyElements { get; set; }
public string SelectedElement { get; set; }
public MainWindowViewModel()
{
MyElements = new List<string>() {"a", "b", "c"};
SelectedElement = "a";
}
}
и программный код
private readonly MainWindowViewModel _viewModel = new MainWindowViewModel();
public MainWindow()
{
InitializeComponent();
DataContext = _viewModel;
}
и мой xaml
<ComboBox
ItemsSource="{Binding MyElements, Mode=OneWay}"
SelectedItem="{Binding SelectedElement}" />
Это отлично работает, и если я выберу элемент в поле со списком, он будет привязан к моей модели представления.
Хорошо, теперь я хочу сделать мою viewModel статической, но по-прежнему двусторонней привязки selectedItem. Я пробую это:
public class MainWindowViewModel
{
public static List<String> MyElements { get; set; }
public static string SelectedElement { get; set; }
static MainWindowViewModel()
{
MyElements = new List<string>() {"a", "b", "c"};
SelectedElement = "a";
}
}
Мне больше не нужно устанавливать контекст данных в программном коде, и я знаю, что xaml нужен экземпляр для двусторонней привязки, поэтому у меня все еще есть конструктор по умолчанию. Затем я связываю поле со списком
<Window.Resources>
<me:MainWindowViewModel x:Key="model"/>
</Window.Resources>
<StackPanel>
<ComboBox
ItemsSource="{Binding Source={x:Static me:MainWindowViewModel.MyElements}, Mode=OneWay}"
SelectedItem="{Binding Source={StaticResource model}, Path=SelectedElement}" />
</StackPanel>
Начальное значение правильно привязано, но если я выберу другой элемент с помощью поля со списком, это не отразится в моей модели представления. Что я делаю неправильно?
ИЗМЕНИТЬ:
Если я использую точно такую же строку привязки для TextBox и изменяю текст в поле, это отражается в свойстве.
<TextBox Text="{Binding Source={StaticResource model}, Path=SelectedElement}"/>
Итак, очевидно, моя строка привязки верна, но то, как я использую поле со списком, кажется неправильным. Я также попытался связать SelectedValue
вместо этого... тоже без изменений.
public static string SelectedElement
для записи вывода трассировки при вызове установщика, и он вызывается каждый раз при изменении выбранного элемента. Вы все равно можете заменить привязкуItemsSource
статической ссылкой, как предложил @Baboon. - person Clemens   schedule 13.07.2012