我正在使用 MVVM 和一些代码,我面临以下 IntelliSense 错误:
在“MainWindow”类型中找不到属性“Date”。
如果我清理,构建/重建,错误会很快消失。一旦我开始编辑它的 XAML 内容,它就会再次出现。解决此问题的一种方法是将我的错误列表设置为内置而不是内置 + 智能感知。
这是我所拥有的:
<Controls:MetroWindow
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wpfTool="clr-namespace:Xceed.Wpf.Toolkit;assembly=Xceed.Wpf.Toolkit"
xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:local="clr-namespace:T_Tacoma"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:ViewModel="clr-namespace:T_Tacoma.ViewModel"
x:Name="Tacoma"
x:Class="Tacoma.MainWindow"
d:DesignHeight="300"
d:DataContext="{d:DesignInstance {x:Type local:MainWindow}}" ***<!-- or replace with d:DataContext="{d:DesignInstance ViewModel:TacomaViewModel, IsDesignTimeCreatable=False}" -->
Title=""
Height="857" Width="1484.582"
WindowState="Maximized"
SizeToContent="Manual"
WindowStartupLocation="CenterScreen"
TitleCaps ="False">
<Grid>
<DatePicker x:Name="vDatePick" HorizontalAlignment="Right" SelectedDate="{Binding MDate, Mode=TwoWay}"/>
<TabControl SelectedIndex="{Binding SelectedTabIndex, Mode=TwoWay}" VerticalContentAlignment="Stretch">
<DataGrid
AutoGenerateColumns="False"
VirtualizingPanel.IsVirtualizingWhenGrouping="True"
ColumnHeaderStyle="{StaticResource lowCase}"
x:Name="dtGrid" ItemsSource="{Binding}"
HorizontalContentAlignment="Stretch">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Location}" Header="Location" Visibility="Collapsed"/>
<DataGridTextColumn Binding="{Binding Date, StringFormat=MM-dd-yy}" Header="Date"/>
<DataGridTextColumn Binding="{Binding RegularHours}" Header="Regular Hours"/>
<DataGridTextColumn Binding="{Binding OvertimeHours}" Header="Overtime Hours"/>
</DataGrid.Columns>
</DataGrid>
</TabControl>
</Grid>
</Controls:MetroWindow>
代码隐藏:
using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using MySql.Data.MySqlClient;
using MySql.Data;
using MahApps.Metro.Controls;
using BespokeFusion;
using Tacoma.ViewModel;
namespace T_Tacoma
{
public partial class MainWindow : MetroWindow
{
public MainWindow()
{
InitializeComponent();
DataContext = new TacomaViewModel();
string connectionString = "datasource=;port=;username=;password=";
string sMonth = DateTime.Now.ToString("MM");
string sYear = DateTime.Now.ToString("yyyy");
MySqlConnection connection = new MySqlConnection(connectionString);
MySqlCommand cmd = new MySqlCommand("Select ID, Location, Date, Name, RegularHours, OvertimeHours from Stats.Tacoma where MONTH(Date) = @sMonth AND YEAR(Date) = @sYear", connection);
try
{
connection.Open();
cmd.Parameters.Add(new MySqlParameter("sMonth", sMonth));
cmd.Parameters.Add(new MySqlParameter("sYear", sYear));
DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());
dtGrid.DataContext = dt;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
connection.Close();
}
视图模型:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using T_Tacoma.Model;
using LiveCharts;
using LiveCharts.Wpf;
using System.Windows;
using Xceed.Wpf;
using T_Tacoma;
namespace Tacoma.ViewModel
{
public class TacomaViewModel : INotifyPropertyChanged
{
public TacomaViewModel()
{
Set...();
}
private int _selectedTabIndex;
public int SelectedTabIndex
{
get { return _selectedTabIndex; }
set
{
_selectedTabIndex = value;
OnPropertyChanged("SelectedTabIndex");
}
}
public DateTime mDate = DateTime.Now;
public DateTime MDate
{
get { return mDate; }
set
{
if (value == mDate)
{
return;
}
else if (_selectedTabIndex == 0)
{
mDate = value;
}
else
{
mDate = value;
OnPropertyChanged("MDate");
Task.Run(() =>
{
Set...();
});
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName = null)
{
try
{
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
如果我离开d:DataContext="{d:DesignInstance {x:Type local:MainWindow}}"
,我的 ViewModel 属性会出现错误(MDate
,SelectedTabIndex
)。如果将其替换为d:DataContext="{d:DesignInstance ViewModel:TacomaViewModel, IsDesignTimeCreatable=False}"
I 仅在数据网格中绑定的列上得到错误 ( Location
, Date
, RegularHours
, OvertimeHours
)
这是我尝试过的,希望它能起作用,但它没有:
<DataGrid d:DataContext="{d:DesignInstance {x:Type local:MainWindow}}"
AutoGenerateColumns="False"
VirtualizingPanel.IsVirtualizingWhenGrouping="True"
ColumnHeaderStyle="{StaticResource lowCase}"
x:Name="dtGrid" ItemsSource="{Binding}"
HorizontalContentAlignment="Stretch">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Location}" Header="Location" Visibility="Collapsed"/>
<DataGridTextColumn Binding="{Binding Date, StringFormat=MM-dd-yy}" Header="Date"/>
<DataGridTextColumn Binding="{Binding RegularHours}" Header="Regular Hours"/>
<DataGridTextColumn Binding="{Binding OvertimeHours}" Header="Overtime Hours"/>
</DataGrid.Columns>
</DataGrid>
<DatePicker d:DataContext="{d:DesignInstance Type=ViewModel:TacomaViewModel}"
x:Name="vDatePick" SelectedDate="{Binding MDate, Mode=TwoWay}"/>
<TabControl d:DataContext="{d:DesignInstance Type=ViewModel:TacomaViewModel}
SelectedIndex="{Binding SelectedTabIndex, Mode=TwoWay}" VerticalContentAlignment="Stretch">
</TabControl>
我怎样才能解决这个问题,而不必将所有内容从我的代码隐藏移动到 ViewModel?我知道我可能没有使用最佳实践,但有没有简单的方法来解决这个问题?
在花了一些时间之后,我设法通过执行以下操作来解决它:
d:DataContext="{d:DesignInstance ViewModel:TacomaViewModel, IsDesignTimeCreatable=False}"
<DataGrid DataContext="{Binding Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}}"...</DataGrid>
我希望它可以帮助其他人。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句