none
wpf下如何实现mvvm的自定义控件呢 RRS feed

  • 问题

  • 你好,我有个自定义控件NewEditBar,它包含2个委托,我如何将委托转换为可以被调用者接受的command呢?

    一般情况下的mvvm是像下面代码一样的

    <Grid x:Name="ContainerGrid">
    <Button Command={Binding NewCmd}/>
    </Grid>
    
    public class ContainerGridViewModel
    {
         RelayCommand NewCmd;
         public ContainerGridViewModel()
        {
            NewCmd = new  RelayCommand (this.Click);
        }
    
         public void Click(object arg)
        {
           // 执行
        }
    }
    
    public View 
    {
        public View()
       { 
           ContainerGrid.DataContext = new ContainerGridViewModel();
       }
    }

    但是现在Button被替换成

    <Grid x:Name="ContainerGrid">
    <NewBar New="New1"/>
    </Grid>
    
    <Grid x:Name="ContainerGrid2">
    <NewBar New="New2" Edit="Edit2"/>
    </Grid>
    
    NewBar.Xaml
    <StackPanel x:Name="ContainerGrid">
    <Button Click="Click1"/>
    <Button  Click="Click2"/>
    </StackPanel>
    
    public Click1(object sender, RoutedEventArgs e)
    {
         New?.Invoke();
    }
    
    public Click2(object sender, RoutedEventArgs e)
    {
        Edit?.Invoke();
    }
    
    public event Action New;
    public event Func<bool> Edit;

    这里的委托就不能使用ViewModel的Command绑定了,该如何处理才能达成MVVM呢?或者说该如何架构呢?

    有源码的话更好。

    谢谢



    code

    2017年6月13日 8:19

答案

  • 没看懂

    如果你是要点按钮触发command,然后调用NewBar里的操作的话。

    1.你可以NewBar里写个依赖属性,绑ViewModel的bool值,依赖属性变了就触发事件。


    2。实在不行,你可以传NewBar控件到ViewModel里。

    OnDataChanged()

    {

      viewModel.NewBar = newBar;

    }

    Command()

    {

     NewBar.New();

    //NewBar.New.Invoke();

    }

    3.我觉得都不好,干嘛不在Command里更改数据,控件只管绑定这个数据去刷新呢?

    • 已标记为答案 skczjun 2017年6月16日 1:14
    2017年6月14日 14:59