Я работаю над проектом WPF. Это мой XAML код:ComboBox привязка к пользовательскому ViewModel
<Window x:Class="MyNamespace.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:l="clr-namespace:MyNamespace"
xmlns:p="clr-namespace:MyNamespace.Properties"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="500" Title="{x:Static p:Resources.Title}" Width="500"
WindowStartupLocation="CenterScreen">
<Window.Resources>
<l:BrowsersViewModel x:Key="BrowsersViewModel"/>
</Window.Resources>
<Canvas Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"
DataContext="{StaticResource BrowsersViewModel}">
<ComboBox Canvas.Left="10" Canvas.Top="10" DisplayMemberPath="Name"
ItemsSource="{Binding Path=Items}"
SelectedItem="{Binding Mode=TwoWay, Path=SelectedItem}"
SelectedValuePath="Process" Width="379"/>
<Button Content="Repopulate" Canvas.Right="10"
Canvas.Top="10" Width="75"/>
</Canvas>
</Window>
И это мой ViewModel код:
// BrowserInstance is a simple struct with two public fields:
// 1) System.Diagnostics.Process Process
// 2) System.String Name
public sealed class BrowsersViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private BrowserInstance m_SelectedItem;
public BrowserInstance SelectedItem
{
get { return m_SelectedItem; }
set
{
if (m_SelectedItem != value)
{
m_SelectedItem = value;
NotifyPropertyChanged("SelectedItem");
}
}
}
private ObservableCollection<BrowserInstance> m_Items;
public ObservableCollection<BrowserInstance> Items
{
get { return m_Items; }
set
{
if (m_Items != value)
{
m_Items = value;
NotifyPropertyChanged("Items");
}
}
}
public BrowsersViewModel()
{
m_Items = new ObservableCollection<BrowserInstance>();
Populate();
}
private void NotifyPropertyChanged(String propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, (new PropertyChangedEventArgs(propertyName)));
}
public void Populate()
{
foreach (Process process in Process.GetProcessesByName("chrome"))
{
BrowserInstance instance = new BrowserInstance();
instance.Process = process;
instance.Name = "[Chrome] "
+ process.Handle.ToString()
+ " " + ((process.MainWindowTitle.Length > 0) ?
process.MainWindowTitle : "NULL");
m_Items.Add(instance);
}
NotifyPropertyChanged("Items");
}
}
У меня действительно несладко получать эту работу. Я посмотрел на ТОНЫ примеров повсюду, и я до сих пор не могу найти решение, чтобы все работало должным образом.
1) Я вижу много значений внутри выпадающего списка ComboBox, но все они пустые. Я хотел бы отобразить свойство BrowserInstance.Name
внутри ComboBox и получить значение BrowserInstance.Process
при выборе элемента.
2) Когда приложение запускается, выполняется проверка текущих запущенных процессов браузера, чтобы заполнить ComboBox. Если не найдены запущенные экземпляры, как я могу отобразить сообщение внутри моего ComboBox, например «Нет экземпляров, которые были найдены!»?
3) Если один или несколько экземпляров браузера найдены, когда статистика приложения, как я могу выбрать первый по умолчанию?
4) Кнопка Repopulate будет использоваться для повторной проверки экземпляров браузера пользователями. Предположим, что ранее выбранный экземпляр все еще работает ... как я могу сохранить выбранный? И если ранее выбранные экземпляры больше не запускаются, как я могу выбрать по умолчанию первый раз еще раз?
Большое спасибо!
EDIT: Вот мой текущий код
MainWindow:
public MainWindow()
{
InitializeComponent();
DataContext = m_BrowserInstances = new BrowserInstancesViewModel();
}
private void OnClickButtonRefresh(Object sender, RoutedEventArgs e)
{
m_BrowserInstances.Populate();
}
BrowserInstancesViewModel:
public void Populate()
{
BrowserInstance selectedItem = m_SelectedItem;
List<BrowserInstance> items = new List<BrowserInstance>();
foreach (Process process in Process.GetProcessesByName("chrome"))
items.Add(new BrowserInstance(process));
if (items.Count > 0)
{
m_Items = new ObservableCollection<BrowserInstance>(items.OrderBy(x => x.Process.Id));
if ((selectedItem != null) && (m_Items.SingleOrDefault(NewMethod(selectedItem)) != null))
m_SelectedItem = selectedItem;
else
m_SelectedItem = m_Items[0];
m_Enabled = true;
}
else
{
m_Items = new ObservableCollection<BrowserInstance>() { (new BrowserInstance()) };
m_SelectedItem = m_Items[0];
m_Enabled = false;
}
NotifyPropertyChanged("Enabled");
NotifyPropertyChanged("Items");
NotifyPropertyChanged("SelectedItem");
}
Почему вы используете структуру? вместо этого создайте класс. –
Хорошо, но результат не меняется. Я все еще испытываю первый вопрос ... –
копировать наклеенный код, я не могу реплицировать первую проблему, здесь все работает – dnr3