Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 触发selectedindexchange事件后填充控件_C#_Wpf_Xaml_Mvvm_Devexpress - Fatal编程技术网

C# 触发selectedindexchange事件后填充控件

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

我有一个MVVM WPF项目,其中有一个devexpress accordian控件,该控件由来自ViewModel的xml模板项填充。这很好,但我的问题是当我单击accordian控件中的一个项时,selectedIndexChanged事件被触发。我想以MVVM的方式处理这个问题,并获取selected items Values,它是从accordian控件到xml文件的路径,获取xml文件的内容,并将textbox控件与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>
最后是我的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;
    }
}