Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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# 跨多个视图模型绑定_C#_Wpf - Fatal编程技术网

C# 跨多个视图模型绑定

C# 跨多个视图模型绑定,c#,wpf,C#,Wpf,我的wpf程序中有多个选项卡,打开每个选项卡会加载不同的UserControl 在我的主窗口中,我有一些项目,如进度条和选项卡标题,它们应该在所有用户控件中都可见。这是我的主窗口的样子 对于每个用户控件,我将堆栈面板的数据上下文设置为每个用户控件的不同ViewModel。“堆栈”面板具有文本框。在调用文本框的“文本”的“集合”时,绑定属性将检查文本并设置绑定到文本框的边界笔刷的“笔刷”属性。因此,用户可以实时看到它们是正确的还是错误的 decimal _cAS; public decimal

我的wpf程序中有多个选项卡,打开每个选项卡会加载不同的UserControl

在我的主窗口中,我有一些项目,如进度条和选项卡标题,它们应该在所有用户控件中都可见。这是我的主窗口的样子


对于每个用户控件,我将堆栈面板的数据上下文设置为每个用户控件的不同ViewModel。“堆栈”面板具有文本框。在调用文本框的“文本”的“集合”时,绑定属性将检查文本并设置绑定到文本框的边界笔刷的“笔刷”属性。因此,用户可以实时看到它们是正确的还是错误的

decimal _cAS;
public decimal cAS
{
    get { return _cAS; }
    set 
    {   
        _cAS = value;
        OnPropertyChanged("cAS");

        BrushConverter converter = new BrushConverter();
        if (_cAS<= 17 || _cAS >= 19)
            CASB= (Brush)converter.ConvertFromString("#FF0000");
        else
            CASB = (Brush)converter.ConvertFromString("#008000");
    }
}

System.Windows.Media.Brush _casb;
public System.Windows.Media.Brush CASB
{
    get { return _casb; }
    set { _casb = value; OnPropertyChanged("CASB"); }
}

如何在代码中知道所有值都输入正确。按钮的数据上下文是mainViewModel,而不是特定的ViewModel。

我认为最适合您案例的方法是创建一个。

我认为最适合您案例的方法是创建一个。

对于类似的内容,我会有一个类似这样的
mainViewModel

public class MainViewModel
{
    ObservableCollection<ITabViewModel> Tabs { get; set; }
    int CurrentTabIndex { get; set; }
    int MaxTabIndex { get; set; }
    int Progress { get; set; }
    ICommand NextTab { get; set; }

    public MainViewModel()
    {
        Tabs = new ObservableCollection<ITabViewModel>();
        Tabs.Add(new Introduction());
        Tabs.Add(new Step1());
        Tabs.Add(new Step2());
        Tabs.Add(new Step3());

        Progress = 0;
        CurrentTabIndex = 0;
        MaxTabIndex = 0;
    }
}
public void NextTab()
{
    if (CurrentTabIndex == Tabs.Count - 1)
        return; // on last tab already

    CurrentTabIndex++;

    // if user is on last enabled tab
    if (CurrentTabIndex == MaxTabIndex)
    {
        MaxTabIndex++;
        Progress += 100 / Tabs.Count;
    }
}
IntroViewModel Intro { get; set; }
Step1ViewModel Step1 { get; set; }
Step2ViewModel Step2 { get; set; }
Step3ViewModel Step3 { get; set; }

bool IsStep1Enabled { get; set; }
bool IsStep2Enabled { get; set; }
bool IsStep3Enabled { get; set; }
NextTab
命令可能看起来像这样

public class MainViewModel
{
    ObservableCollection<ITabViewModel> Tabs { get; set; }
    int CurrentTabIndex { get; set; }
    int MaxTabIndex { get; set; }
    int Progress { get; set; }
    ICommand NextTab { get; set; }

    public MainViewModel()
    {
        Tabs = new ObservableCollection<ITabViewModel>();
        Tabs.Add(new Introduction());
        Tabs.Add(new Step1());
        Tabs.Add(new Step2());
        Tabs.Add(new Step3());

        Progress = 0;
        CurrentTabIndex = 0;
        MaxTabIndex = 0;
    }
}
public void NextTab()
{
    if (CurrentTabIndex == Tabs.Count - 1)
        return; // on last tab already

    CurrentTabIndex++;

    // if user is on last enabled tab
    if (CurrentTabIndex == MaxTabIndex)
    {
        MaxTabIndex++;
        Progress += 100 / Tabs.Count;
    }
}
IntroViewModel Intro { get; set; }
Step1ViewModel Step1 { get; set; }
Step2ViewModel Step2 { get; set; }
Step3ViewModel Step3 { get; set; }

bool IsStep1Enabled { get; set; }
bool IsStep2Enabled { get; set; }
bool IsStep3Enabled { get; set; }
如果“下一步”按钮必须位于选项卡内的各个控件上,那么您可能可以执行以下操作

foreach(ITabViewModel tab in Tabs)
{
    tab.NextButtonCommand = this.NextTab;
}
可能有很多额外的案例需要检查或调整,但这应该能给你一个大致的想法

当然,您的XAML可能还需要修改以支持这一点


不过,作为替代方案,您可以替换

ObservableCollection<ITabViewModel> Tabs  { get; set; }
并让您的MainViewModel指定代理,以确定应启用什么,或者在单击“下一步”时会发生什么

Intro.NextDelegate = this.GoToStep1;
Step1.NextDelegate = this.GoToStep2;
Step2.NextDelegate = this.GoToStep3;

Step1.IsValidChanged += delegate { IsStep2Enabled = Step1.IsValid; }
Step2.IsValidChanged += delegate { IsStep3Enabled = Step2.IsValid; }

就个人而言,我不喜欢这样,但这是一个选项:)

对于这样的东西,我会有一个类似这样的
MainViewModel

public class MainViewModel
{
    ObservableCollection<ITabViewModel> Tabs { get; set; }
    int CurrentTabIndex { get; set; }
    int MaxTabIndex { get; set; }
    int Progress { get; set; }
    ICommand NextTab { get; set; }

    public MainViewModel()
    {
        Tabs = new ObservableCollection<ITabViewModel>();
        Tabs.Add(new Introduction());
        Tabs.Add(new Step1());
        Tabs.Add(new Step2());
        Tabs.Add(new Step3());

        Progress = 0;
        CurrentTabIndex = 0;
        MaxTabIndex = 0;
    }
}
public void NextTab()
{
    if (CurrentTabIndex == Tabs.Count - 1)
        return; // on last tab already

    CurrentTabIndex++;

    // if user is on last enabled tab
    if (CurrentTabIndex == MaxTabIndex)
    {
        MaxTabIndex++;
        Progress += 100 / Tabs.Count;
    }
}
IntroViewModel Intro { get; set; }
Step1ViewModel Step1 { get; set; }
Step2ViewModel Step2 { get; set; }
Step3ViewModel Step3 { get; set; }

bool IsStep1Enabled { get; set; }
bool IsStep2Enabled { get; set; }
bool IsStep3Enabled { get; set; }
NextTab
命令可能看起来像这样

public class MainViewModel
{
    ObservableCollection<ITabViewModel> Tabs { get; set; }
    int CurrentTabIndex { get; set; }
    int MaxTabIndex { get; set; }
    int Progress { get; set; }
    ICommand NextTab { get; set; }

    public MainViewModel()
    {
        Tabs = new ObservableCollection<ITabViewModel>();
        Tabs.Add(new Introduction());
        Tabs.Add(new Step1());
        Tabs.Add(new Step2());
        Tabs.Add(new Step3());

        Progress = 0;
        CurrentTabIndex = 0;
        MaxTabIndex = 0;
    }
}
public void NextTab()
{
    if (CurrentTabIndex == Tabs.Count - 1)
        return; // on last tab already

    CurrentTabIndex++;

    // if user is on last enabled tab
    if (CurrentTabIndex == MaxTabIndex)
    {
        MaxTabIndex++;
        Progress += 100 / Tabs.Count;
    }
}
IntroViewModel Intro { get; set; }
Step1ViewModel Step1 { get; set; }
Step2ViewModel Step2 { get; set; }
Step3ViewModel Step3 { get; set; }

bool IsStep1Enabled { get; set; }
bool IsStep2Enabled { get; set; }
bool IsStep3Enabled { get; set; }
如果“下一步”按钮必须位于选项卡内的各个控件上,那么您可能可以执行以下操作

foreach(ITabViewModel tab in Tabs)
{
    tab.NextButtonCommand = this.NextTab;
}
可能有很多额外的案例需要检查或调整,但这应该能给你一个大致的想法

当然,您的XAML可能还需要修改以支持这一点


不过,作为替代方案,您可以替换

ObservableCollection<ITabViewModel> Tabs  { get; set; }
并让您的MainViewModel指定代理,以确定应启用什么,或者在单击“下一步”时会发生什么

Intro.NextDelegate = this.GoToStep1;
Step1.NextDelegate = this.GoToStep2;
Step2.NextDelegate = this.GoToStep3;

Step1.IsValidChanged += delegate { IsStep2Enabled = Step1.IsValid; }
Step2.IsValidChanged += delegate { IsStep3Enabled = Step2.IsValid; }

就我个人而言,我不喜欢这样,但这是一种选择:)

好的,我想我得到了一些。在进入新选项卡之前,如何检查每个选项卡中的文本框是否输入正确?另外,你能告诉我更多关于这个的xaml设计吗。我很抱歉,我是一个初学者编程一般@user2196163我将拥有一个
,并使用隐式数据模板告诉WPF如何绘制每个项目类型(IntroViewModel、Step1ViewModel等)。您还可以使用
ItemContainerStyle
将选项卡标题绑定到VM上的属性。就我个人而言,我会将“下一步”按钮移到TabControl之外,但这不是必需的。至于如何判断每个选项卡上的文本框是否正确,请让您的TabViewModels实现
IDataErrorInfo
,并且您应该有一个属性来标识TabViewModel是否有效。好的,我想我得到了一些。在进入新选项卡之前,如何检查每个选项卡中的文本框是否输入正确?另外,你能告诉我更多关于这个的xaml设计吗。我很抱歉,我是一个初学者编程一般@user2196163我将拥有一个
,并使用隐式数据模板告诉WPF如何绘制每个项目类型(IntroViewModel、Step1ViewModel等)。您还可以使用
ItemContainerStyle
将选项卡标题绑定到VM上的属性。就我个人而言,我会将“下一步”按钮移到TabControl之外,但这不是必需的。至于如何判断每个选项卡上的文本框是否正确,请让您的TabViewModels实现
IDataErrorInfo
,并且您应该有一个属性来标识TabViewModel是否有效。