在触发选定索引更改事件后填充控件



我有一个 MVVM WPF 项目,其中我有一个 devexpress 手风琴控件,该控件填充了来自 ViewModel 的 xml 模板项。这很好用,但我的问题是当我单击手稿控件中的一个项目并触发 selectedIndexChanged 事件时。我想以 MVVM 的方式处理它,并从手稿控件中获取选定的项目值(这是 xml 文件的路径(,获取 xml 文件的内容并使用 xml 文件的内容对文本框控件进行数据绑定。以下是我到目前为止尝试过的方法。

这是我的 xaml 用户控件

<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>

这归结为AccordionEventArgsConverter,它从手风琴控件中的选定项中获取事件参数:

public class AccordionEventArgsConverter : 
EventArgsConverterBase<AccordionSelectedItemChangedEventArgs>
{
protected override object Convert(object sender, 
AccordionSelectedItemChangedEventArgs args)
{
if (args != null)
{
return args;
}
return null;
}
}

最后是我的视图模型:

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 文件中的文本块元素?

有几件事:

  • 您需要 TemplateMenuViewModel 来定义 XML 属性。看起来您的文本块已经绑定到它。
  • 然后,您需要视图模型来实现INotifyPropertyChanged接口。看起来您没有这样做,然后在设置 XML 文本时引发属性更改事件。
  • 您应该使用单向模式设置Text="{Binding XML}"

    text="{Binding XML, Mode=OneWay}">

如果您需要有关如何实现INotifyPropertyChanged的更多信息,请查看本教程:https://www.tutorialspoint.com/mvvm/mvvm_first_application.htm。