Я столкнулся с болезненной точки зрения в отношении своего приложения WPF, и здесь я в идеале пытаюсь добиться того, чтобы в древовидной структуре с дочерними элементами имелся поле со списком рядом с каждым элементом, а в этом поле со списком было 3 текстовых значения. Такие как
ParentItem1 Выпадающий ComboBox с 3 элементами
ChildItem1 Выпадающий ComboBox с 3 элементами
ChildItem2 Выпадающий ComboBox с 3 элементами
ParentItem2 Выпадающий ComboBox с 3 элементами
ChildItem1 Выпадающий ComboBox с 3 элементами
ChildItem2 Выпадающий ComboBox с 3 элементами
ChildItem3 Выпадающий ComboBox с 3 элементами
К счастью, я дошел до того, что перечислил несколько фиктивных данных для древовидной структуры и представил комбинированный список, но, к сожалению, 3 значения не отображаются. Я использую шаблон MVVM здесь, где я связываю свои данные с моделью представления и наоборот. вот код, который у меня есть:
Код Xaml:
<Grid.Resources>
<HierarchicalDataTemplate x:Key="servicesKey" DataType="{x:Type src:Service}" ItemsSource="{Binding Path=Children}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Name}" Margin="5,10,0,0" />
<ComboBox Name="cmbStatusList"
ItemsSource="{Binding StateList}"
IsTextSearchEnabled="True"
SelectionChanged="cmb_SelectionChanged"
DisplayMemberPath="State"
IsEditable="True"
IsReadOnly="True"
SelectedValuePath="StateID"
Width="150"
Margin="20,0,0,0">
<ComboBox.SelectedValue>
<Binding Path="NewIncident.StateID" Mode="TwoWay" UpdateSourceTrigger="Explicit">
<Binding.ValidationRules>
<validation:ComboBoxRules />
</Binding.ValidationRules>
</Binding>
</ComboBox.SelectedValue>
</ComboBox>
</StackPanel>
</HierarchicalDataTemplate>
</Grid.Resources>
<TreeView Name="treeServices"
ContextMenuOpening="ContextMenu_ContextMenuOpening"
ItemsSource="{Binding ServiceModel.Services}"
ItemTemplate="{StaticResource servicesKey}"
VirtualizingPanel.IsVirtualizing="True"
Margin="0,0,10,10">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource {x:Type TreeViewItem}}"/>
</TreeView.ItemContainerStyle>
</TreeView>
Сервис-модель
public class ServiceViewModel : ViewModelBase
{
private List<Service> _services;
public ServiceViewModel()
{
_services = new List<Service>();
}
public List<Service> Services
{
get { return _services; }
set { _services = value; OnPropertyChanged("Services"); }
}
public override void OnChange()
{
throw new NotImplementedException();
}
}
public class Service : INotifyPropertyChanged
{
public Service(Service parent = null)
{
Children = new List<Service>();
}
public Guid Guid { get; set; }
public string Name { get; set; }
public List<Service> Children { get; set; }
public string State { get; set; }
public ServiceState StateID { get; set; }
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
Модель
var statesmodel = _oakStatusProvider.GetServiceState()
.Select(p => new Service()
{
StateID = p.StateID,
State = p.State
});
_incidentViewModel.StateList = new List<Service>(statesmodel);
this.DataContext = _incidentViewModel;
Получить метод обслуживания
public List<ServiceDTO> GetServiceState()
{
List<ServiceDTO> servicestatelist = new List<ServiceDTO>
{
new ServiceDTO { StateID = ServiceState.Normal, State = "Normal" },
new ServiceDTO { StateID = ServiceState.Degraded, State = "Degraded" },
new ServiceDTO { StateID = ServiceState.Critical, State = "Critical" },
};
return servicestatelist;
}
Состояния, которые будут использоваться в CMBbox
public enum ServiceState
{
Normal = 0,
Degraded = 10,
Critical = 20,
}
Результат:
Результат комбинированного списка с видом на дерево
Привязка напрямую к Combobox работает нормально, похоже, DataTemplete все портит?
<ComboBox Name="cmbSstatusList"
ItemsSource="{Binding StateList}"
IsTextSearchEnabled="True"
SelectionChanged="cmb_SelectionChanged"
DisplayMemberPath="State"
IsEditable="True"
IsReadOnly="True"
SelectedValuePath="StateID"
materialDesign:HintAssist.Hint="State"
Style="{StaticResource MaterialDesignFloatingHintComboBox}"
Width="150"
Height="45"
FontSize="15" >
<ComboBox.SelectedValue>
<Binding Path="NewIncident.StateID" Mode="TwoWay" UpdateSourceTrigger="Explicit">
<Binding.ValidationRules>
<validation:ComboBoxRules />
</Binding.ValidationRules>
</Binding>
</ComboBox.SelectedValue>
</ComboBox>
Результат:
Рабочая CMB
Заранее спасибо за любую помощь и помощь :). любые вопросы, пожалуйста, дайте мне знать.