我有一个问题,DataContextChanged没有在我的自定义Panel控件的逻辑子上引发.我把它缩小到这个:
从向导生成的WPF应用程序开始,我添加:
private void Window_Loaded( object sender, RoutedEventArgs e )
{
var elt = new FrameworkElement();
this.AddLogicalChild( elt );
DataContext = 42;
Debug.Assert( (int)elt.DataContext == 42 );
}
Run Code Online (Sandbox Code Playgroud)
据我所知,这是有效的,因为DataContext是一个可继承的依赖属性.
现在,我在Window(this)及其逻辑子代上为DataContextChanged添加事件处理程序:
this.DataContextChanged +=
delegate { Debug.WriteLine( "this:DataContextChanged" ); };
elt.DataContextChanged +=
delegate { Debug.WriteLine( "elt:DataContextChanged" ); };
Run Code Online (Sandbox Code Playgroud)
如果我运行它,只会执行第一个事件处理程序.为什么是这样?如果不是AddLogicalChild(elt),我会执行以下操作:
this.Content = elt;
Run Code Online (Sandbox Code Playgroud)
两个处理程序都将执行.但是在我的情况下这不是一个选项 - 我正在向我的控件中添加FrameworkContentElements,它们不应该是可视化的孩子.
这里发生了什么?除了AddLogicalChild()之外,我还应该做些什么来使它工作吗?
(幸运的是,有一个相当简单的解决方法 - 只需将元素的DataContext绑定到窗口的DataContext)
BindingOperations.SetBinding( elt, FrameworkElement.DataContextProperty,
new Binding( "DataContext" ) { Source = this …
Run Code Online (Sandbox Code Playgroud) 我Cannot access object: DataContext after it's been disposed
在下面的DAL方法中得到了一个.我以为我可以在那里打电话处理. result
是一个IEnumurable
,我认为这是IQueryable
造成这些问题的原因.
我究竟做错了什么?如何应该我来处置我的DataContext
.还有什么比返回更好的DataTable
吗?这是一个指向SQL 2005的桌面应用程序.
导致此错误的示例方法 - >
public static DataTable GetEnrolledMembers(Guid workerID)
{
var DB = CmoDataContext.Create();
var AllEnrollees = from enrollment in DB.tblCMOEnrollments
where enrollment.CMOSocialWorkerID == workerID || enrollment.CMONurseID == workerID
join supportWorker in DB.tblSupportWorkers on enrollment.EconomicSupportWorkerID
equals supportWorker.SupportWorkerID into workerGroup
from worker in workerGroup.DefaultIfEmpty()
select
new
{
enrollment.ClientID,
enrollment.CMONurseID,
enrollment.CMOSocialWorkerID,
enrollment.EnrollmentDate,
enrollment.DisenrollmentDate,
ESFirstName = worker.FirstName,
ESLastName = worker.LastName, …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将一些内联工作作为语句Lambda注入到LINQ查询中select
,如此...
// NOTE: mcontext.Gettype() == System.Data.Linq.DataContext
// Okay - compiles, nothing unusual
var qPeople1 = from ME.tblPeople person in mcontext.tblPeoples
select person;
// ERROR - see below compile Error - Can I retrofit this thing?
var qPeople2 = from ME.tblPeople person in mcontext.tblPeoples
select (() => {
return person;
})();
Run Code Online (Sandbox Code Playgroud)
错误:
错误2方法名称预期file.cs 166 27 MigrationCore
...但是我也同样很高兴看到Expression Lambda首先内联工作.
注意:我知道代码示例是多余的,但我正在寻找基本概念.如果它可行,我将扩展它.
我一直在几个简单的情况下使用数据绑定,取得了相当不错的成功.通常我只使用INotifyPropertyChanged来启用我的代码隐藏来修改屏幕上的GUI值,而不是为所有内容实现依赖项属性.
我正在使用LED控件来了解有关用户控件中数据绑定的更多信息,并被迫使用依赖属性,因为VS2008告诉我必须这样做.我的应用程序很简单 - 我有一个窗口,显示几个LED控件,每个控件上面都有一个数字,可选择一个控件.LED应该可以使用默认颜色进行定义,以及更改状态.
我开始写一个LED控制器,看起来非常好.首先,我开始使用这样的代码:
LED.xaml
<UserControl x:Class="LEDControl.LED"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="Auto" Width="Auto">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<!-- LED portion -->
<Ellipse Grid.Column="0" Margin="3" Height="{Binding LEDSize}" Width="{Binding LEDSize}" Fill="{Binding LEDColor}" StrokeThickness="2" Stroke="DarkGray" />
<Ellipse Grid.Column="0" Margin="3" Height="{Binding LEDSize}" Width="{Binding LEDSize}">
<Ellipse.Fill>
<RadialGradientBrush GradientOrigin="0.5,1.0">
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform CenterX="0.5" CenterY="0.5" ScaleX="1.5" ScaleY="1.5"/>
<TranslateTransform X="0.02" Y="0.3"/>
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Offset="1" Color="#00000000"/>
<GradientStop Offset="0.4" Color="#FFFFFFFF"/>
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
<!-- label -->
<TextBlock Grid.Column="1" Margin="3" VerticalAlignment="Center" Text="{Binding LEDLabel}" />
</Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
这样可以很好地吸收LED.然后,我将LEDSize,LEDLabel和LEDColor绑定到Ellipse属性,方法是this.DataContext …
我编写了以下C#和XAML代码:
namespace ListViewExample1
{
public partial class MainWindow : Window
{
public ObservableCollection<MyColleague> myCollegues = new ObservableCollection<MyColleague>();
public MainWindow()
{
myCollegues.Add(new MyColleague() { Name = "Tim", Surname = "Meier" });
myCollegues.Add(new MyColleague() { Name = "Martin", Surname = "Hansen" });
myCollegues.Add(new MyColleague() { Name = "Oliver", Surname = "Drumm" });
InitializeComponent();
}
public ObservableCollection<MyColleague> MyColleagues
{
get { return this.myCollegues; }
}
}
public class MyColleague
{
public String Name { get; set; }
public String Surname { get; set; …
Run Code Online (Sandbox Code Playgroud) 我在一个简单的WPF应用程序中有三张图片。汽车,飞机和火车。
当我单击它们中的任意一个时,我将加载一个具有运输名称,图片文件路径和其他字符串属性的适当的“运输”对象。一个简单的POCO对象。
如何在XAML中声明各种模板,以便随后可以将该POCO对象用作数据源,并将属性X放在元素Foo中?
这是我简单的XAML:
<StackPanel>
<TextBlock>Car</TextBlock>
<TextBlock>Slow</TextBlock>
<TextBlock>4 Wheels</TextBlock>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
因此,此处的属性将是我提供的POCO的模板持有人。
如何提供此数据上下文?
我有一个XAML文件代表WPF应用程序的主窗口.现在我希望此窗口显示由另一个XAML文件指定的内容.这有效,但在DataContext
我的C#代码中丢失了UserControl
.
我认为<Frame Source=....>
以某种方式破坏了WPF的逻辑树.我希望有相同的行为,就好像<Frame Source=....>
只是被Content1.xaml文件内容替换,即DataContext
周围Window
类的继承到UserControl
.
有没有一种简单的方法可以解决这个问题?我发现的所有解决方案看起来都有点矫枉过正.
伪代码
MainWindow.xaml
<Window ....>
<Frame Source="Content1.xaml" />
</Window>
Run Code Online (Sandbox Code Playgroud)
Content1.xaml
<UserControl ....>
<!-- Content goes here -->
</UserControl>
Run Code Online (Sandbox Code Playgroud) 我需要在wpf xaml中访问parent的DataContext.整个xaml页面代码是动态的.所以不知道父母的类型.
我写这个
<Grid DataContext={Binding Path=.}>
Run Code Online (Sandbox Code Playgroud)
它是否正确?
我正在遵循John Papa的课程中的每一步,使用Angular和Breeze构建应用程序 - 第1部分.一旦我完成了题为"在第一个片段开始播放通过您的应用创建垂直片段"的模块,我开始得到breezeProvider错误.
请在下面找到错误图片,以及datacontext.js代码.
非常感谢您的建议.
-------------------------------------------
Run Code Online (Sandbox Code Playgroud)
在F12 Dev Tools中,控制台错误是:
未捕获错误:找不到breeze localhost:1772/Scripts/breeze.angular.js:90 [shell] Hot Towel Angular loading!空值
错误:[$ injector:unpr]未知提供者:breezeProvider < - breeze < - entityManagerFactory < - datacontext
[app] [CC Error] [$ injector:unpr]未知提供者:breezeProvider < - breeze < - entityManagerFactory < - datacontext
这是我的datacontext.js代码:
(function () {
'use strict';
var serviceId = 'datacontext';
angular.module('app').factory(serviceId, ['common', 'entityManagerFactory', datacontext]);
function datacontext(common, emFactory) { // emFactory param refers to 'entityManagerFactory'
var EntityQuery = breeze.EntityQuery;
var getLogFn = common.logger.getLogFn;
var log = getLogFn(serviceId); …
Run Code Online (Sandbox Code Playgroud) 我在后面的代码中设置我的数据上下文,并在XAML中设置绑定.调试显示我的数据上下文正在从我的模型填充,但这并没有反映在我的视图中.
可能是简单的事情,但这让我困扰了好几个小时.
public partial class MainWindow : Window
{
public MainWindow(MainWindowVM MainVM)
{
this.DataContext = MainVM;
InitializeComponent();
}
}
public class MainWindowVM : INotifyPropertyChanged
{
private ICommand m_ButtonCommand;
public User UserModel = new User();
public DataAccess _DA = new DataAccess();
public MainWindowVM(string email)
{
UserModel = _DA.GetUser(UserModel, email);
//ButtonCommand = new RelayCommand(new Action<object>(ShowMessage));
}
}
public class User : INotifyPropertyChanged
{
private int _ID;
private string _FirstName;
private string _SurName;
private string _Email;
private string _ContactNo;
private List<int> _allocatedLines;
public …
Run Code Online (Sandbox Code Playgroud) datacontext ×10
wpf ×7
c# ×5
xaml ×3
.net ×2
data-binding ×2
.net-3.5 ×1
angularjs ×1
binding ×1
breeze ×1
frame ×1
hottowel ×1
lambda ×1
linq ×1
linq-to-sql ×1
logical-tree ×1
mvvm ×1
navigation ×1