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