Как я и обещал, я создал пример, в котором нет UIElements
внутри ViewModels
.
Прежде всего, я удалил много кода из вашего метода:
public class MainViewModel
{
public MainViewModel()
{
//For demonstration
this.ViewUIElements = new ObservableCollection<VisualQueryObject>
{
new VisualQueryObject{LabelType = "column", ColumnDiscriptor = new DescriptionModel("Table1", "Column2") },
new VisualQueryObject{LabelType = "controller"},
new VisualQueryObject{LabelType = "value"},
};
}
public void UpdateCollection(VisualQueryObject helperVisualQueryObject)
{
VisualQueryObject visualQueryData = new VisualQueryObject();
//I would remove copying, but maybe it is intended behavior
//***Taking a copy of the static DraggedData object to be bound
visualQueryData.ColumnDiscriptor = helperVisualQueryObject.ColumnDiscriptor;
visualQueryData.ComparedValue = helperVisualQueryObject.ComparedValue;
visualQueryData.JoinWithColumnDescriptor = helperVisualQueryObject.JoinWithColumnDescriptor;
visualQueryData.LabelType = helperVisualQueryObject.LabelType;
visualQueryData.OperatorValue = helperVisualQueryObject.OperatorValue;
this.ViewUIElements.Add(visualQueryData);
//QueryDesignerModel.QueryDesignHelperCollection.Add(visualQueryData); //I don't know what this method does
}
public ObservableCollection<VisualQueryObject> ViewUIElements { get; private set; }
}
Затем я создал класс DataTemplateSelector
, в который я поместил предложения if из функции в вашем вопросе:
public class QueryObjectDateTemplateSelector : DataTemplateSelector
{
public DataTemplate ColumnTemplate { get; set; }
public DataTemplate ControllerTemplate { get; set; }
public DataTemplate ValueTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
{
var visualQueryData = item as VisualQueryObject;
if (visualQueryData == null)
return null;
if (visualQueryData.LabelType == "column")
return ColumnTemplate;
else if (visualQueryData.LabelType == "controller")
return ControllerTemplate;
else if (visualQueryData.LabelType == "value")
return ValueTemplate;
else return null;
}
}
И это почти все. Все остальное в xaml
:
<Window.Resources>
<ItemsPanelTemplate x:Key="WrapPanelTemplate">
<WrapPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
<DataTemplate x:Key="ColumnDataTemplate">
<Label DataContext="{Binding ColumnDiscriptor}" Foreground="White" Background="DarkOrange" BorderThickness="5">
<TextBlock>
<Run Text="{Binding TableName}"/><Run Text="."/><Run Text="{Binding ColumnName}"/>
</TextBlock>
</Label>
</DataTemplate>
<DataTemplate x:Key="ControllerDataTemplate">
<Label Content="Controller"/>
</DataTemplate>
<DataTemplate x:Key="ValueDataTemplate">
<TextBox Text="Value"/>
</DataTemplate>
<local:QueryObjectDateTemplateSelector x:Key="ModelSelector"
ColumnTemplate="{StaticResource ColumnDataTemplate}"
ControllerTemplate="{StaticResource ControllerDataTemplate}"
ValueTemplate="{StaticResource ValueDataTemplate}"/>
</Window.Resources>
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Grid>
<ItemsControl ItemsSource="{Binding ViewUIElements}" ItemsPanel="{StaticResource WrapPanelTemplate}"
ItemTemplateSelector="{StaticResource ModelSelector}"/>
</Grid>
Я кодировал только шаблон столбца, другие шаблоны должны быть переписаны также на xaml.
Теперь вы можете вызвать этот метод:
((MainViewModel)this.DataContext).UpdateCollection(DraggedData as VisualQueryObject);