C# 触发selectedindexchange事件后填充控件
我有一个MVVM WPF项目,其中有一个devexpress accordian控件,该控件由来自ViewModel的xml模板项填充。这很好,但我的问题是当我单击accordian控件中的一个项时,selectedIndexChanged事件被触发。我想以MVVM的方式处理这个问题,并获取selected items Values,它是从accordian控件到xml文件的路径,获取xml文件的内容,并将textbox控件与xml文件的内容进行数据绑定。以下是我迄今为止所做的尝试 这是我的xaml用户控件C# 触发selectedindexchange事件后填充控件,c#,wpf,xaml,mvvm,devexpress,C#,Wpf,Xaml,Mvvm,Devexpress,我有一个MVVM WPF项目,其中有一个devexpress accordian控件,该控件由来自ViewModel的xml模板项填充。这很好,但我的问题是当我单击accordian控件中的一个项时,selectedIndexChanged事件被触发。我想以MVVM的方式处理这个问题,并获取selected items Values,它是从accordian控件到xml文件的路径,获取xml文件的内容,并将textbox控件与xml文件的内容进行数据绑定。以下是我迄今为止所做的尝试 这是我的xa
<dxa:AccordionControl Grid.Column="0" x:Name="accordianTemplateMenu"
SelectionMode="Single" SelectionUnit="SubItemOrRootItem" ItemsSource="
{Binding TemplateItems}"
ChildrenPath="TemplateItems" DisplayMemberPath="Header >
<dxmvvm:Interaction.Behaviors>
<dxmvvm:EventToCommand EventName="SelectedItemChanged" Command="
{Binding EditCommand}">
<dxmvvm:EventToCommand.EventArgsConverter>
<Common:AccordionEventArgsConverter/>
</dxmvvm:EventToCommand.EventArgsConverter>
</dxmvvm:EventToCommand>
</dxmvvm:Interaction.Behaviors>
</dxa:AccordionControl>
<GridSplitter Grid.Column="1" />
<TextBlock Grid.Column="2" x:Name="templateItemContainer">
<Run Name="run" Text="{Binding XML}" ></Run>
</TextBlock>
最后是我的viewmodel:
class TemplateMenuViewModel
{
private List<TemplateItem> _templateItems;
public TemplateMenuViewModel()
{
EditCommand = new DelegateCommand<object>(Edit, CanEdit);
}
public List<TemplateItem> TemplateItems
{
get
{
TemplateProvider provider = new TemplateProvider();
return provider.GetTemplateMenuItems("pathToMenuItems");
}
set { _templateItems = value; }
}
public ICommand<object> EditCommand { get; private set; }
public void Edit(object accordianItemArgs)
{
}
public bool CanEdit(object accordianItemArgs)
{
return accordianItemArgs != null;
}
}
我能够使用public void Edit方法,这非常好,因为从那里我可以使用accordianItemArgs来获取xml内容,但是如何将xml内容返回/数据绑定到xaml文件中的textblock元素?有几件事: 您需要TemplateMenuViewModel来定义XML属性。看起来您的TextBlock已经绑定到它了。 然后需要ViewModel来实现INotifyPropertyChanged接口。看起来您没有这样做,然后在设置XML文本时引发属性更改事件。 您应该将Text={Binding XML}设置为单向模式: Text={Binding XML,Mode=OneWay}
如果需要有关如何实现INotifyPropertyChanged的更多信息,请查看本教程: 非常感谢您的帮助,当我实现INotifyPropertyChanged接口并在编辑方法中触发OnPropertyChangedXml时,它起到了作用:OnPropertyChanged应该在XML属性设置器中调用,而不是在编辑方法中调用。如果有其他方式可以更改XML属性,则更安全的做法是在属性设置器中触发事件。
class TemplateMenuViewModel
{
private List<TemplateItem> _templateItems;
public TemplateMenuViewModel()
{
EditCommand = new DelegateCommand<object>(Edit, CanEdit);
}
public List<TemplateItem> TemplateItems
{
get
{
TemplateProvider provider = new TemplateProvider();
return provider.GetTemplateMenuItems("pathToMenuItems");
}
set { _templateItems = value; }
}
public ICommand<object> EditCommand { get; private set; }
public void Edit(object accordianItemArgs)
{
}
public bool CanEdit(object accordianItemArgs)
{
return accordianItemArgs != null;
}
}