所以,正如标题所说,我有一个对象是propertyInfo.我想得的是那个属性,但我似乎无法找到办法.
首先我有这个方法:
public object GetPropertyInfo(object parent, String propertyName)
{
object propInf = null;
PropertyInfo[] propList = parent.GetType().GetProperties();
foreach (PropertyInfo pInf in propList)
{
if (propertyName == pInf.Name)
{
propInf = pInf;
}
}
return propInf;
}
Run Code Online (Sandbox Code Playgroud)
并且它运行得相当好,假设提供的"父"对象是常规类而不是反射类型.
但是返回的一些属性包含我想要访问的属性.在这些情况下,我需要将PropertyInfo反馈到此方法中,并为该属性获取另一个PropertyInfo.但是,如果我将PropertyInfo对象放入此方法,它只返回PropertyInfo的属性列表(如您所想).
我已经阅读了它,似乎我可能想要的是PropertyInfo类的'GetValue'方法.我有点不确定它,因为我似乎无法解析方法所需的内容.
即便如此,我也是这样写的:
public object GetPropertyInfo(object parent, String propertyName)
{
object propInf = null;
object o = null;
if (parent is PropertyInfo)
{
PropertyInfo p = (parent as PropertyInfo);
o = p.GetValue(p, null);
}
else
o = parent;
PropertyInfo[] propList = o.GetType().GetProperties();
foreach …Run Code Online (Sandbox Code Playgroud) 概述:我有一个XAML Canvas控件,我在其上放置了几个Line控件.线条出现在它们不应该的位置,我的结论是所述线条的边界框是行为不端的.我不访问或更改这些边界框(据我所知).
项目详细信息:我在Visual Studio 2010中使用WPF,XAML,C#和MVVM模式.
更详细的解释:我的项目是创建一个画布,并在该画布上有可以被用户拖动的项目.在一个项目和另一个项目之间绘制线条以显示可视链接.
要进行可视化,您可以在此处查看图像:
有五个项目,在代码中,N1项目应按行链接到N3,N4和N5项目.N1到N3线看起来很好,但另外两条线是偏移的.如果你要将它们移动起来,它们会很好地将这些项目链接在一起.
你可以考虑的第一件事是画布中线条的坐标,我已经这样做了.
请查看此图片:
我在与Line相同的区域内向XAML添加了一个TextBlock,并将其Text绑定到Line的StartingPoint.如果图像很小,可能很难看到这里,但我可以告诉你,这里的两条线的StartingPont是相同的.然而,显然我们可以看到线条不在同一个地方.
我还认为这可能是一个对齐的问题.我没有在我的项目中设置任何路线,所以我想也许这就是问题所在.我将线条改为不同的对齐方式(水平和垂直方向)以及项目本身,我发现没有区别.
项目更详细:
首先是项目本身的资源.我不认为它有所作为,但由于我全都没有想法,我不能忽视这个问题可能在某个地方看不见:
<ResourceDictionary>
<ControlTemplate x:Key="NodeTemplate">
<Border BorderThickness="2" BorderBrush="LightBlue" Margin="2" CornerRadius="5,5,5,5">
<StackPanel>
<TextBlock Text="Test" Background="AntiqueWhite"/>
<TextBlock Text="{Binding Path=NodeText}" Background="Aqua"/>
</StackPanel>
</Border>
</ControlTemplate>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
现在,在下面,Canvas本身具有ItemsControls:
<Canvas>
<ItemsControl ItemsSource="{Binding NodeList, UpdateSourceTrigger=PropertyChanged}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding LineList, UpdateSourceTrigger=PropertyChanged}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<Line Stroke="Black" X1="{Binding StartPoint.X}" Y1="{Binding StartPoint.Y}" X2="{Binding EndPoint.X}" Y2="{Binding EndPoint.Y}" />
<!--Path Stroke="Black" Data="{Binding}" Canvas.Left="0" Canvas.Top="0" StrokeMiterLimit="1"/-->
<TextBlock Text="{Binding StartPoint}" HorizontalAlignment="Center"/>
</StackPanel>
</DataTemplate> …Run Code Online (Sandbox Code Playgroud) 我正在使用WPF(C#,Visual Studio 2010,MVVM Light)并且遇到三个Listbox控件的问题.
所以情况就是这样:我有三个Listbox.第一个是"示例"的ID列表.第二个也是"相关项目"的ID列表.它们是我的程序中的示例和相关项目,它们代表动词(如语言类型).
如果单击这两个ListBox中的任何一个,它将填充第三个ListBox.两者互不影响,只有第三种.第三个不影响其他两个.第三个一次只能容纳一个项目.
除了一种情况外,它运作良好.假设'examples'ListBox包含ID 100002和100003.我们还说'相关项'ListBox包含ID 100004和100005.我单击100002,因此第一个ListBox的选定项成为该项.第三个列表框显示100002的详细信息(应该如此).然后我点击100004上的第二个列表框.这成为第二个列表框的选定项目,第三个列表框显示100004.到目前为止.但现在我想说无论出于什么原因我想再回到100002.由于它仍然是第一个列表框中的选定项目,因此再次单击它无效.视图模型中的setter甚至没有被触发,因此我无法在那里做任何事情.事实上,我不确定在这种情况下我的选择是什么.我确实考虑过使用'examples'的setter来设置'相关项'的选定项为null,反之亦然,但我意识到这将导致无限循环.
我也尝试使用一个变量链接到前两个ListBoxes的选定项目,但这并没有解决问题.
我也尝试过以下方法:
private LanguageItemViewModel _selectedExampleOrRelatedItemTestVM = null;
public LanguageItemViewModel SelectedExampleOrRelatedItemTestVM
{
get { return _selectedExampleOrRelatedItemTestVM; }
set
{
if (_selectedExampleOrRelatedItemTestVM != value)
{
Mediator.EventMediator.Instance.PassLanguageItemAsExampleOrRelatedItem(value);
_selectedExampleOrRelatedItemTestVM = null;
RaisePropertyChanged("SelectedExampleOrRelatedItemTestVM");
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,在触发相关事件之后,变量本身只是设置为null.这也行不通.
也许有人在那里有一些建议,甚至一些我没有考虑过的途径?谢谢.
我的代码中有一个必须具有void返回类型的方法,它只能采用一个特定的参数.我需要从中归还一些东西.
为您提供详细信息:我有一个WCF服务,它具有SQL服务器访问权限.它有一个名为SQLMetal.exe的程序生成的代码.这给了我一个部分方法的部分类(DataContext).我正在构建这个partial类的另一部分,这些部分方法就像'InsertUser'或'DeleteUser'.它们没有在partial类的其他部分实现,但我想这意味着我必须实现它们.这很好,但是如果它们是部分方法,它们必须有一个void返回类型.
那么如果我想从其中一个中返回一些内容怎么办?我的意思是,应用程序可以连接到此服务,并可以使用它来访问数据库信息.该应用程序需要知道服务端是否存在错误.
所以它是一个带有void返回类型和一组预定义参数的部分方法.
该怎么办?
编辑:更多细节!
首先,为什么我不能改变生成的代码?嗯,这是一个很好的建议,但我对此表示担忧.它生成的原因是为了在数据库发生变化并且必须重新生成代码时尽量减少未来的编码问题.
其次,一些代码:
[System.Data.Linq.Mapping.DatabaseAttribute(Name = "HVD01")]
public partial class HydraDataContext : System.Data.Linq.DataContext
{
private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMappingSource();
#region Extensibility Method Definitions
partial void OnCreated();
partial void InsertClient(Client instance);
partial void UpdateClient(Client instance);
Run Code Online (Sandbox Code Playgroud)
这就是生成代码的相关部分.
那是我的一部分.这是另一个与生成的部分结合的部分类.
public void UpdateClient(Client client)
{
//Primary key can't be zero
if (client.ClientID == 0)
return;
dc.Clients.Attach(client, true);
dc.SubmitChanges();
}
Run Code Online (Sandbox Code Playgroud)
显然,有可能需要返回的东西.
异常怎么样?好吧,如果我在WCF服务上抛出一个,我认为应用程序不会得到它(我可能在这里错了).该应用程序使用该服务,但我不认为在该服务上抛出异常将到达消费应用程序.是吗?
也许只是改变功能是最好的.我只是想到了重点是尽可能多地保留生成的代码,以防你需要重新生成它.
再次感谢.
我有一个名为LanguageItem的自定义对象列表.该LanguageItem包含一个名为"Tag"的项目列表.每个标签都有一个ID.
现在我已经阅读了LINQ,但所有的例子(我在这个网站和其他人在阅读我的问题之前阅读过)似乎都集中在你正在搜索的列表对象中的一个属性.
所以,假设我有一个标签,所以我有我的标签ID.我想要的是一个LanguageItems列表,其中包含一个带有该ID的标签.
我有过几次尝试,但我似乎没有任何进展,所以我转向你们.
我想知道的是如何将字符串转换为运算符.
我希望能够将一个值与另一个值进行比较,并且它是否为真的条件是字符串.例如,字符串可能是'>'或'> ='或者其他我可以定义为'GREATER_THAN'的东西.
最好的方式只是一个案例,还是有更好的东西使用C#的所有wizadry?