繁体   English   中英

MVVM-Light不同的绑定源触发上下文中的所有ViewModel

[英]MVVM-Light Different binding source triggers all ViewModels in context

我在针对mvvm-light的测试模型中遇到一种奇怪的行为:我创建了一个Window并设置了两个资源,一个包含两个不同dataContext的网格,问题是即使我正在使用,两个视图模型也正在接收响应仅一个dataContext的一侧。 有没有一种方法可以只将指定的数据上下文设置为触发我指示的视图模型?

XAML代码:

<Window x:Class="POCWPFValidation.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="clr-namespace:POCWPFValidation.ViewModel"
        Title="MainWindow" Height="350" Width="525" >
    <Window.Resources>
        <vm:MainViewModel x:Key="Main"/>
        <vm:SecondaryView x:Key="Sec"/>
    </Window.Resources>
    <Grid>
        <StackPanel Orientation="Horizontal">
            <StackPanel Orientation="Vertical" DataContext="{Binding Source={StaticResource Main}}">
                <CheckBox Content="CheckBox" IsChecked="{Binding CheckBox1Checked}" HorizontalAlignment="Left" VerticalAlignment="Top"/>
                <CheckBox Content="CheckBox" IsChecked="{Binding CheckBox2Checked}" HorizontalAlignment="Left" VerticalAlignment="Top"/>
                <CheckBox Content="CheckBox" IsChecked="{Binding CheckBox3Checked}" HorizontalAlignment="Left" VerticalAlignment="Top"/>
                <CheckBox Content="CheckBox" IsChecked="{Binding CheckBox4Checked}" HorizontalAlignment="Left" VerticalAlignment="Top"/>
                <TextBox Text="{Binding StringTest, UpdateSourceTrigger=PropertyChanged}" />
                <Button Content="Button" Command="{Binding Teste}" HorizontalAlignment="Left" VerticalAlignment="Top" Background="{x:Null}" DataContext="{Binding Mode=OneWay}"/>
                <Button Content="Button" Command="{Binding Teste2}" CommandParameter="{Binding ElementName=TextBox1, Path=Text}" HorizontalAlignment="Left" VerticalAlignment="Top" Background="{x:Null}" DataContext="{Binding Mode=OneWay}"/>
            </StackPanel>

            <StackPanel Orientation="Vertical" DataContext="{Binding Source={StaticResource Sec}}">
                <CheckBox Content="CheckBox" IsChecked="{Binding CheckBox1Checked}" HorizontalAlignment="Left" VerticalAlignment="Top"/>
                <CheckBox Content="CheckBox" IsChecked="{Binding CheckBox2Checked}" HorizontalAlignment="Left" VerticalAlignment="Top"/>
                <CheckBox Content="CheckBox" IsChecked="{Binding CheckBox3Checked}" HorizontalAlignment="Left" VerticalAlignment="Top"/>
                <CheckBox Content="CheckBox" IsChecked="{Binding CheckBox4Checked}" HorizontalAlignment="Left" VerticalAlignment="Top"/>
                <TextBox Text="{Binding StringTest, UpdateSourceTrigger=PropertyChanged}" />
                <Button Content="Button" Command="{Binding Teste}" HorizontalAlignment="Left" VerticalAlignment="Top" Background="{x:Null}" DataContext="{Binding Mode=OneWay}"/>
                <Button Content="Button" Command="{Binding Teste2}" CommandParameter="{Binding ElementName=TextBox1, Path=Text}" HorizontalAlignment="Left" VerticalAlignment="Top" Background="{x:Null}" DataContext="{Binding Mode=OneWay}"/>
            </StackPanel>
        </StackPanel>

    </Grid>
</Window>

视图是相同的,因此只需将名称更改为SecondaryView

    namespace POCWPFValidation.ViewModel
    {
      public class MainViewModel : ViewModelBase
      {
          private bool m_blnCheckBox1Checked;
        private bool m_blnCheckBox2Checked;
        private bool m_blnCheckBox3Checked;
        private bool m_blnCheckBox4Checked;
        public bool CheckBox1Checked
        {
            get { return m_blnCheckBox1Checked; }
            set
            {
                Set(ref m_blnCheckBox1Checked, value, true);
            }
        }
        public bool CheckBox2Checked
        {
            get { return m_blnCheckBox2Checked; }
            set
            {
                Set(ref m_blnCheckBox2Checked, value, true);
            }
        }
        public bool CheckBox3Checked
        {
            get { return m_blnCheckBox3Checked; }
            set
            {
                Set(ref m_blnCheckBox3Checked, value, true);
            }
        }
        public bool CheckBox4Checked
        {
            get { return m_blnCheckBox4Checked; }
            set
            {
                Set(ref m_blnCheckBox4Checked, value, true);
            }
        }

        string m_strStringTest = string.Empty;
        public string StringTest
        {
            get { return m_strStringTest; }
            set
            {
                Set(ref m_strStringTest, value, true);
            }
        }

        public RelayCommand<string> Teste2 { get; private set; }

        public RelayCommand Teste { get; private set; }

        public MainViewModel()
        {
            Teste = new RelayCommand(MyAction, MyCanExecute);
            Teste2 = new RelayCommand<string>(MyAction2, MyCanExecute2);
        }

        private void MyAction()
        {


        }
        private void MyAction2(string seila)
        {

        }

        private bool MyCanExecute2(string teste)
        {
            return !string.IsNullOrWhiteSpace(teste);            

        }

        private bool MyCanExecute()
        {
            if (CheckBox1Checked && CheckBox2Checked && CheckBox3Checked && CheckBox4Checked && StringTest.Equals("teste"))
            {
                return true;
            }
            return false;
        }
    }
}

编辑:

抱歉,我不清楚我的问题,让我再试一次:如前所述,我在mainWindow中有两个视图模型和两个不同的数据上下文,每个视图模型一个。 每当这些视图模型中的任何一个属性发生更改时,都会触发两个视图模型的所有canExecute方法。 更改视图A的某些属性,就会在视图A和视图B上触发执行。有没有办法仅在特定的CanExecute负责视图上触发?

CanExecute不是由属性更改触发的,而是由CommandManager.RequerySuggested事件触发的。 不必担心何时调用的WPF会处理该问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM