Thanks Ruantec... playtime!!!!
var parseable = this as IManageable;
if(parseable != null)
{
parseable.InstanceID = Guid.NewGuid();
ViewModelManager.AddViewModel(this);
}
var childVM = ViewModelManager.GetViewModel(typeof(ChildViewModel)) as ChildViewModel;
if(childVM != null)
{
// Voila! we have a reference to the parent viewmodel and can now access it's property.
}
public class ManagerVMConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Type type = Type.GetType(string.Format("MVVMTutorial.ViewModels.{0}", parameter.ToString()));
return ViewModelManager.GetViewModel(type);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
}
xmlns:converters="clr-namespace:MVVMTutorial.Converters"
<Window.Resources>
<converters:ManagerVMConverter x:Key="ManagerConverter"/>
</Window.Resources>
<Button DataContext="{Binding Converter={StaticResource ManagerConverter}, ConverterParameter=ChildViewModel}"/>
<ContentControl Grid.Row="3" Margin="0,10,0,17" DataContext="{Binding WorkPermitDetailItems}">
<Grid>
<Label Content="Applicant Name" HorizontalAlignment="Left" VerticalAlignment="Top" />
<ComboBox ItemsSource="{Binding ApplicantLookupItems}"
DisplayMemberPath="FullName"
SelectedValuePath ="UserID"
SelectedValue="{Binding SelectedApplicantItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Height="23" Width="200" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,23,0,0" />
public WorkPermitViewModel()
{
getWorkPermitDetails();
getApplicantLookupItems();
}
private ApplicantLookupList selectedApplicantItem;
public ApplicantLookupList SelectedApplicantItem
{
get { return selectedApplicantItem; }
set { SetProperty(ref selectedApplicantItem, value); }
}
private void getApplicantLookupItems()
{
var query = from u in db.Users
select new
{
UserID = (int?)u.UserID ?? 0,
FullName = u.FirstName + " " + u.LastName
};
applicantLookupItems = new List<ApplicantLookupList>();
foreach (var user in query)
{
var _user = newApplicantLookupList();
_user.UserID = user.UserID;
_user.FullName = user.FullName;
applicantLookupItems.Add(_user);
}
InvokePropertyChanged("ApplicantLookupItems");
SelectedApplicantItem = applicantLookupItems.FirstOrDefault(selectedItem => selectedItem.UserID == WorkPermitDetailItems.FirstOrDefault().ApplicantID);
}
private ApplicantLookupList selectedApplicantItem;
public ApplicantLookupList SelectedApplicantItem
{
get { return selectedApplicantItem; }
set { SetProperty(ref selectedApplicantItem, value); }
}
private int selectedApplicantID;
public int SelectedApplicantID
{
get { return selectedApplicantID; }
set { SetProperty(ref selectedApplicantID, value); }
}
SelectedApplicantID = applicantLookupItems.FirstOrDefault(selectedItem => selectedItem.UserID == WorkPermitDetailItems.FirstOrDefault().ApplicantID).UserID;
SelectedIsolationListItem = isolationDetailListItems.FirstOrDefault(selectedItem => selectedItem.IsolationListID == IsolationDetailListItems.FirstOrDefault().IsolationListID);
private static void IsMethodChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var element = d as FrameworkElement;
if (element != null)
{
// Create events here
element.PreviewMouseUp += element_PreviewMouseUp;
element.MouseLeave += element_MouseLeave;
}
}
static void element_PreviewMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
InvokeViewModelMethod(sender, PTWSys.ViewModels.ViewModelBase.EvenTypes.MouseLeftButtonUp);
}
static void element_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
InvokeViewModelMethod(sender, PTWSys.ViewModels.ViewModelBase.EvenTypes.MouseLeftButtonUp);
}
behaviours:EventBehaviour.MethodParameter="IsolationTypeChanged"
private static void IsMethodChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var element = d as FrameworkElement;
var events = EventManager.GetRoutedEvents();
if (element != null)
{
foreach (var routedEvent in events)
{
string thisControlType = element.GetType().FullName.ToString();
switch (routedEvent.Name)
{
case "PreviewMouseUp":
if (thisControlType != "System.Windows.Controls.ComboBox") element.PreviewMouseUp += element_PreviewMouseUp;
break;
case "MouseLeave":
if (thisControlType == "System.Windows.Controls.ComboBox") element.MouseLeave += element_MouseLeave;
break;
}
}
}
}
static void element_PreviewMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
InvokeViewModelMethod(sender, PTWSys.ViewModels.ViewModelBase.EvenTypes.MouseLeftButtonUp);
}
static void element_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
InvokeViewModelMethod(sender, PTWSys.ViewModels.ViewModelBase.EvenTypes.None);
}
// Up
void StepMoveUp()
{
if (SelectedJobStepItem != null)
{
if (this.EventType == EvenTypes.MouseLeftButtonUp)
{
var selectedUser = SelectedJobStepItem;
int currentIndex = jobStepItems.IndexOf(SelectedJobStepItem);
if (currentIndex == 0) return;
JobStepItems.RemoveAt(currentIndex);
currentIndex--;
JobStepItems.Insert(currentIndex, selectedUser);
SelectedJobStepItem = jobStepItems.FirstOrDefault(selectedItem => selectedItem.JobSafetyAnalysisStepID == selectedUser.JobSafetyAnalysisStepID);
}
}
}
// Down
void StepMoveDown()
{
if (SelectedJobStepItem != null)
{
if (this.EventType == EvenTypes.MouseLeftButtonUp)
{
var selectedUser = SelectedJobStepItem;
int currentIndex = jobStepItems.IndexOf(SelectedJobStepItem);
if (currentIndex == JobStepItems.Count - 1) return;
JobStepItems.RemoveAt(currentIndex);
currentIndex++;
JobStepItems.Insert(currentIndex, selectedUser);
SelectedJobStepItem = jobStepItems.FirstOrDefault(selectedItem => selectedItem.JobSafetyAnalysisStepID == selectedUser.JobSafetyAnalysisStepID);
}
}
}
void StepMoveDown()
{
if (SelectedJobStepItem != null)
{
if (this.EventType == EvenTypes.MouseLeftButtonUp)
{
var copyJobStepItem = JobStepItems[SelectedJobStepIndex];
++selectedJobStepIndex;
JobStepItems[selectedJobStepIndex] = copyJobStepItem;
JobStepItems[selectedJobStepIndex - 1] = JobStepItems[selectedJobStepIndex];
InvokePropertyChanged("JobStepItems");
}
}
}
private void SwapJobStepItems(int indexToUse, bool increase = false)
{
// Make a copy of the selected item
var copy = SelectedJobStepItem;
// Make a copy of the selected index
var indexcopy = SelectedJobStepIndex;
// Swap items
JobStepItems[indexcopy] = JobStepItems[indexToUse];
JobStepItems[indexToUse] = copy;
for (int i = 0; i < JobStepItems.Count; i++ )
{
JobStepItems[i].StepNumber = i + 1;
}
InvokePropertyChanged("JobStepItems");
// Set the new index
SelectedJobStepIndex = increase ? ++indexcopy : --indexcopy;
}