我试图找到一个简单的例子,其中枚举按原样显示.我见过的所有示例都尝试添加漂亮的显示字符串,但我不希望这种复杂性.
基本上我有一个类,它包含我绑定的所有属性,首先将DataContext设置为此类,然后在xaml文件中指定这样的绑定:
<ComboBox ItemsSource="{Binding Path=EffectStyle}"/>
Run Code Online (Sandbox Code Playgroud)
但是这并没有在ComboBoxas项中显示枚举值.
嗨,有没有人知道是否有任何内置的类从bindingexpression解析绑定对象,它的DataItem和属性路径?
我正在尝试为文本框编写Blend 3行为,该行为会自动调用绑定到文本框Text属性的对象上的方法.
文本框绑定到viewmodel类的属性.我想要做的是从绑定表达式解析viewmodel类,然后对此进行调用.
我首先从行为的关联对象中检索绑定表达式,如下所示:
private BindingExpression GetTextBinding()
{
return this.AssociatedObject.GetBindingExpression(TextBox.TextProperty);
}
Run Code Online (Sandbox Code Playgroud)
完成此操作后,如果我们查看绑定表达式,我们可以看到它通过绑定表达式的DataItem属性引用了数据上下文.
另外,我们有绑定表达式父绑定绑定的属性的相对路径.
所以,我们可以得到这些信息:
var bindingExpression = GetTextBinding();
object dataContextItem = bindingExpression.DataItem;
PropertyPath relativePropertyPath = bindingExpression.ParentBinding.Path;
Run Code Online (Sandbox Code Playgroud)
现在,这个属性路径可能是一个深度嵌套和复杂的路径,我非常希望避免(重新)实现解析.我已经搜索了.NET文档并用反射器围绕组件弹跳,但都无济于事 - 我找不到肯定必须存在的东西 - 必须有一些类来执行数据项目的路径解析(数据上下文).
有谁知道这可能存在的地方?有关解决绑定对象的替代方法的任何建议吗?
注意,我正在尝试获取绑定对象(绑定属性的父节点)(在本例中为字符串) - 我可以很容易地得到绑定值,但它是我需要的父节点.
在此先感谢您的帮助!菲尔
我正在编写一个使用WebBrowser控件来查看可以使用AJAX更改新内容/元素的Web内容的应用程序.我似乎无法以任何方式尝试新的元素.BrowserCtl.DocumentText没有最新页面,当然它也不在"查看源代码"中.
有没有办法使用此控件获取此新数据?:(请帮忙.谢谢!
IE:
Browser.Navigate("www.somewebpagewithAJAX.com");
//Code that waits for browser to finish...
...
//WebBrowser control has loaded content and AJAX has loaded new content
// (is visible at runtime on form) but can't see them in Browser.Document.All
// or Browser.DocumentText :(
Run Code Online (Sandbox Code Playgroud) 我有一个我在几年前在WinForms中写过的副项目.为了更好地帮助我学习WPF,我想在WPF中重写它.理想情况下,我想修改我当前的项目并在WPF中重写UI而不是创建新项目.
我在做这件事时遇到了一些问题.我做了以下(使用Visual Studio 2008 SP1):
在这一点上,我注意到有些不对劲.当我右键单击该项目并选择Add | New Item,我没有创建WPF窗口的选项 - 我可以创建的唯一WPF类是WPF用户控件.由于我有一些其他WPF项目,我将App.xaml.*和Window1.xaml.*从该项目复制到我的,并根据需要更新它们(基本上只是将该项目的命名空间更改为我项目的命名空间).
然后我删除了Program.cs(之前包含Main方法,显示了主WinForm表单),并构建了该项目.我收到一个错误,表明没有Main方法.
看起来内部Visual Studio知道这个项目实际上是一个WinForms应用程序,而不是WPF应用程序.在WPF项目中(通过选择"WPF Application"创建),在Application属性中,我可以将Application类的实例设置为启动对象.在我的WinForms转换项目中,这不是一个选项.
我在文本编辑器中快速查看了.csproj文件,但我找不到任何可以告诉Visual Studio项目实际上是WinForms而不是WPF的东西.
还有什么办法可以将我的WinForms项目变成一个"真正的"WPF项目?除了创建新项目并只替换当前项目之外,我还有其他选择吗?
更新:我仔细查看了.csproj文件,我注意到App.xaml已添加为页面:
<Page Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
Run Code Online (Sandbox Code Playgroud)
但是,在我的其他WPF项目中,它是一个ApplicationDefinition.一旦我改变了,我可以将我的Application实例设置为启动对象,我的应用程序将运行.但是,我仍然没有选项来创建除用户控件之外的任何WPF类型.
我IEnumerable<T>在C++/CLI中的自定义集合类中实现时遇到问题.以下是代码的相关部分:
using namespace System::Collections::Generic;
ref class MyCollection : IEnumerable<MyClass^>
{
public:
MyCollection()
{
}
virtual IEnumerator<MyClass^>^ GetEnumerator()
{
return nullptr;
}
};
Run Code Online (Sandbox Code Playgroud)
编译时,会导致以下错误:
错误C2392:'System :: Collections :: Generic :: IEnumerator ^ MyCollection :: GetEnumerator(void)':托管类型不支持协变返回类型,否则'System :: Collections :: IEnumerator ^ System :: Collections :: IEnumerable :: GetEnumerator(void)'将被覆盖错误C3766:'MyCollection'必须提供接口方法'System :: Collections :: IEnumerator ^ System :: Collections :: IEnumerable :: GetEnumerator(void)'的实现
这是有道理的,因为IEnumerable<T>源于IEnumerable.但是,我不确定如何修复此编译错误.如果这是C#,我会隐式实现IEnumerable,但是我不知道如何在C++/CLI(如果可能的话)中这样做:
class MyCollection : IEnumerable<MyClass>
{
public MyCollection()
{
}
public IEnumerator<MyClass> GetEnumerator()
{ …Run Code Online (Sandbox Code Playgroud) 征求关于"最佳"模式的反馈/选项/评论,以用于我的服务中的参考数据.
参考数据是什么意思?
我们以Northwind为例.订单与数据库中的客户相关.当我实现我的订单服务时,在某些情况下,当我只想要一个对客户的引用(例如一个键/值对)时,我会希望引用来自订单的"完整"客户和其他情况.
例如,如果我正在使用GetAllOrders(),我不想返回完全填写的订单,我想要返回订单的轻量版本,其中只包含每个订单的客户的参考数据.但是,如果我使用GetOrder()方法,我可能想填写客户详细信息,因为很可能需要此方法的消费者.可能还有其他情况我可能要求在某些方法调用期间填写客户详细信息,但留给其他人使用.
这是我提出的:
[DataContract]
public OrderDTO
{
[DataMember(Required)]
public CustomerDTO;
//etc..
}
[DataContract]
public CustomerDTO
{
[DataMember(Required)]
public ReferenceInfo ReferenceInfo;
[DataMember(Optional)]
public CustomerInfo CustomerInfo;
}
[DataContract]
public ReferenceInfo
{
[DataMember(Required)]
public string Key;
[DataMember(Required)]
public string Value;
}
[DataContract]
public CustomerInfo
{
[DataMember(Required)]
public string CustomerID;
[DataMember(Required)]
public string Name;
//etc....
}
Run Code Online (Sandbox Code Playgroud)
这里的想法是,因为在CustomerDTO中总是需要ReferenceInfo(它是一个通用的Key/Value对),所以我总是有ReferenceInfo.如果需要,它可以为我提供足够的信息以获取客户详细信息.让CustomerDTO需要ReferenceInfo的缺点是,当我获得完整的CustomerDTO(即填写了CustomerInfo)时,它可能有点过分,但至少我保证参考信息.
我可以使用其他一些模式或框架来使这个场景/实现"更清洁"吗?
我问的原因是,虽然我们可以简单地说在Northwind中总是返回一个完整的CustomerDTO,但这可能在简单的Northwind情况下工作正常.在我的例子中,我有一个对象,有25-50个字段是引用/查找类型数据.有些在不同的情况下加载比其他更重要,但我希望尽可能少地定义这些引用类型(这样我就不会进入"DTO维护地狱").
意见?反馈?评论?
谢谢!
好吧,这有点奇怪,但这基本上就是我需要做的.我有一个绑定到Document对象的WPF控件.Document对象具有Pages属性.所以在我的ViewModel中,我有一个CurrentDocument属性和一个CurrentPage属性.
现在,我有一个组合框,我已绑定到CurrentDocument.Pages属性并更新CurrentPage属性.
<ComboBox ItemsSource="{Binding CurrentDocument.Pages}"
DisplayMemberPath="???"
SelectedItem="{Binding CurrentPage, Mode=TwoWay}">
</ComboBox>
Run Code Online (Sandbox Code Playgroud)
和我一起到目前为止?所有这一切都很好,除了我需要DisplayMemberPath显示"Page 1","Page 2"等.....
我尝试创建一个这样的转换器:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string pageNumber = "Page {0}";
return string.Format(pageNumber, value);
}
Run Code Online (Sandbox Code Playgroud)
并尝试将DisplayMemberPath绑定到它,如下所示:
DisplayMemberPath="{Binding RelativeSource={RelativeSource Self}, Path=Index, Converter={StaticResource pgTitleConv}}"
Run Code Online (Sandbox Code Playgroud)
但它仍然不会出现在组合框文本中!
没有"索引"属性,但我不知道如何做到这一点...如何访问组合框绑定的项目的索引... ??????
我正在尝试创建一个搜索XML文档的winform应用程序.对于我的搜索,我需要通过使用小写()xpath函数将xpath条件中的XML属性转换为小写.这会导致与函数名称空间相关的问题.
我试图手动添加名称空间:
XmlNamespaceManager nsMgr = new XmlNamespaceManager(prs.Doc.NameTable);
nsMgr.AddNamespace("fn", "http://www.w3.org/2005/02/xpath-functions");
XmlNodeList results = prs.Doc.SelectNodes("//function[starts-with(fn:lower-case(@name),'" + txtSearch.Text + "')]",nsMgr);
Run Code Online (Sandbox Code Playgroud)
但我仍然遇到异常:由于函数未知,此查询需要XsltContext.
我已在我的主应用中成功使用Google登录SDK for iOS登录.但是,当我hasAuthIKeyChain()从共享扩展程序调用时,它总是返回false.理想情况下,一旦用户在主应用程序中进行了身份验证,我想signInSilently()在我的共享扩展中调用以使用缓存的凭据.
基于这个问题有关使用Google+登录的SDK,我能为我的应用程序和我的共享扩展两个钥匙扣共享,并设置相同的钥匙串组两者.不幸的是,这没有帮助.但有一点不同的是,我没有看到指定用于Google登录SDK的钥匙串名称的选项.
要在我的主应用和共享扩展程序之间共享Google登录凭据,我需要做什么?
我有一个字典,其中键是一个字符串,值是与该键对应的字符串列表.我想显示字典中的所有键,其中与该键相关联的值标签在该键下方.像这样的东西:
Key 1
Value 1
Value 2
Value 3
Key 2
Value 1
Value 2
Run Code Online (Sandbox Code Playgroud)
在C#2.0中,我会这样做(values是Dictionary):
StringBuilder sb = new StringBuilder();
foreach(KeyValuePair<string, List<string>> pair in values)
{
sb.AppendLine(pair.Key);
foreach(string item in pair.Value)
{
sb.AppendLine('\t' + item);
}
}
Run Code Online (Sandbox Code Playgroud)
我如何使用LINQ进行等效操作?似乎它应该是可能的,但我无法弄清楚如何做到这一点.
如果我使用values.SelectMany(p => p.Values),那么只有值将在最终结果中,而不是键.
我想到的任何其他解决方案都有类似的限制.