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