好的,我一直在与WPF合作,但我需要一些帮助.
我有一个ComboBox
如下:
<TabControl>
<TabItem Header="1">
<ComboBox ItemsSource="{Binding MyList}" SelectedItem="{Binding MyListSelection}"/>
</TabItem>
<TabItem Header="2"/>
</TabControl>
Run Code Online (Sandbox Code Playgroud)
每当我离开标签1然后回到它时,选择就会被移除.我认为这样做的原因是控件在超出范围然后重新进入时会被销毁.但是在过程中,SelectedItem变为null,这不是用户想要的,因为UI是一个事件生命周期.
所以我想知道最佳路线是什么?我正在使用MVVM构建这个应用程序,所以我可以忽略我的ViewModel中MyListSelection属性的set调用,但是我在整个地方都有ComboBox,并且不喜欢修改我的ViewModel,因为我认为它是WPF的一个bug.
我可以子类化WPF ComboBox,但是没有SelectedItemChanging事件我只能在SelectedItem更改时添加处理程序.
有任何想法吗?
更新:
好吧,在我的头撞墙后,我发现为什么我的问题无法复制.如果列表项类型由于某种原因是一个类,则由WPF将SelectedItem设置为null,但如果它是值类型则不会.
这是我的测试类(VMBase只是一个实现INotifyPropertyChanged的抽象类):
public class TestListViewModel : VMBase
{
public TestListViewModel()
{
TestList = new List<TestViewModel>();
for (int i = 0; i < 10; i++)
{
TestList.Add(new TestViewModel(i.ToString()));
}
}
public List<TestViewModel> TestList { get; set; }
TestViewModel _SelectedTest;
public TestViewModel SelectedTest
{
get { return _SelectedTest; }
set
{
_SelectedTest = value;
OnPropertyChanged("SelectedTest");
}
}
}
public class …
Run Code Online (Sandbox Code Playgroud) 有人可以告诉我以下陈述的区别是:
MyObject.MyEvent += new EventHandler(MyEventHandlerMethod);
vs.
MyObject.MyEvent += MyEventHandlerMethod;
Run Code Online (Sandbox Code Playgroud)
每当我+=
点击标签时弹出第一个选项就会弹出,所以我总是离开它.但我想知道我是否可以写第二个.我猜他们两个都编译得一样,但我很好奇,如果那是真的.我很确定我只能看看IL,但我太懒了:)我宁愿问一下.
我刚刚阅读了KnockoutJS,当我尝试绑定到可以为null的对象的子属性时,我得到绑定错误,例如:
<div data-bind="text: selectedAccount().DocumentList().length"></div>
Run Code Online (Sandbox Code Playgroud)
所以一旦你调用ko.applyBindings
它试图评估上面的表达式,如果selectedAccount
是null(它是默认情况下)它会抛出一个错误.我知道我可以这样创造dependentObservable
:
viewModel.docLength = ko.dependentObservable(function () {
return selectedAccount() ? selectedAccount().DocumentList().length : null;
})
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有一个解决方案,除了在ViewModel中放置属性只是因为我得到一个绑定错误.
好的,我正在寻找一些输入,我很确定.NET 3.5目前不支持这个,但是这里有.
我想要一个传递给我的类的泛型类型有一个像这样的构造函数:
new(IDictionary<string,object>)
Run Code Online (Sandbox Code Playgroud)
所以班级看起来像这样
public MyClass<T> where T : new(IDictionary<string,object>)
{
T CreateObject(IDictionary<string,object> values)
{
return new T(values);
}
}
Run Code Online (Sandbox Code Playgroud)
但是编译器不支持这个,它并不真正知道我在问什么.
有些人可能会问,你为什么要这样做?好吧,我正在研究ORM的宠物项目,所以我从数据库中获取值,然后创建对象并加载值.
我认为允许对象只使用我给它的值创建自己会更清晰.据我所知,我有两个选择:
1)使用反射(我试图避免)来获取PropertyInfo []数组,然后使用它来加载值.
2)要求T支持这样的接口:
public interface ILoadValues {void LoadValues(IDictionary values); }
然后这样做
public MyClass<T> where T:new(),ILoadValues
{
T CreateObject(IDictionary<string,object> values)
{
T obj = new T();
obj.LoadValues(values);
return obj;
}
}
Run Code Online (Sandbox Code Playgroud)
我猜这个界面的问题是哲学的,我真的不想公开一种公共方法供人们加载值.使用构造函数的想法是,如果我有一个像这样的对象
namespace DataSource.Data
{
public class User
{
protected internal User(IDictionary<string,object> values)
{
//Initialize
}
}
}
Run Code Online (Sandbox Code Playgroud)
只要MyClass<T>
在同一个程序集中,构造函数就可用.我个人认为我认为Type约束应该问(我有权访问这个构造函数吗?我做的很棒!)
无论如何,欢迎任何输入.
有没有办法在DataContract中发送属性的摘要信息?
例如
[DataContract]
public class MyClass
{
/// <summary>
/// My Summary information
/// </summary>
[DataMember]
public int MyProperty {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
是否可以获得获得datacontract的客户?我怀疑它,只是希望有人知道我不知道的事情,这很可能.:)
我需要一些帮助.我正在创建一个像这样的SelectItem类:
public class SelectItem<T> where T : class
{
public bool IsChecked { get; set; }
public T Item { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我希望以下代码有效
SelectItem<String> obj = new SelectItem<String> { Item = "Value" };
obj.IsChecked = true;
String objValue = obj;
Run Code Online (Sandbox Code Playgroud)
而不是必须这样做:
String objValue = obj.Item;
Run Code Online (Sandbox Code Playgroud)
我怎么能做到这一点?
我想知道为什么根据这篇文章和可观察集合比WPF中的List <>集合明显更快地绑定(20毫秒vs 1685毫秒,比800倍快).我查看了ObservableCollection的内部,它使用List作为它的存储集合对象(我使用了反射器并在构造函数中看到了这个)
public Collection()
{
this.items = new List<T>();
}
Run Code Online (Sandbox Code Playgroud)
那么这里发生了什么?
好吧,我不想在我的MVVM ViewModels中使用一堆ICommands,所以我决定为WPF创建一个MarkupExtension,它为它提供一个字符串(方法的名称),它会返回一个执行该方法的ICommand.
这是一个片段:
public class MethodCall : MarkupExtension
{
public MethodCall(string methodName)
{
MethodName = methodName;
CanExecute = "Can" + methodName;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
Binding bin = new Binding { Converter = new MethodConverter(MethodName, CanExecute) };
return bin.ProvideValue(serviceProvider);
}
}
public class MethodConverter : IValueConverter
{
string MethodName;
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
//Convert to ICommand
ICommand cmd = ConvertToICommand();
if (cmd == null)
Debug.WriteLine(string.Format("Could not bind to method 'MyMethod' …
Run Code Online (Sandbox Code Playgroud) 只想获得知情人士的意见.我正在考虑CSRF的漏洞,以及我所知道的最常见的反对它的方法.该方法是在返回的html中创建一个令牌,并添加一个具有相同值的cookie.因此,如果脚本试图发布帖子,他们就会have to guess the token thats embedded in the web page
成功.
但是,如果他们针对特定网站,为什么他们不能只使用一个脚本
该脚本不需要知道cookie的内容,它只是使用cookie一直来回发送的事实.
我在这里错过了什么?这不可能吗?如果你仔细想想,我觉得这很可怕.
在这一行下面不需要阅读回答问题:)
这个漏洞基于以下事实:认证是基于cookie完成的,我认为这是当前认证的主要方式.
我能想到的另一个解决方案是在页面级别进行身份验证.因此,当他们登录时,返回的html中将包含该令牌.他们单击的每个链接都包含该令牌,因此当Web服务器获取请求时,它可以识别用户/会话.它的问题在于,如果他们使用除此之外的任何导航它们将是"未经身份验证的"(例如输入网址),它在网址中也看起来不太好,因为它可能看起来像这样:
https://www.example.com/SuperSecretPage/1/123j4123jh12pf12g3g4j2h3g4b2k3jh4h5g55j3h3
但我确实理解,如果安全性更重要,那么漂亮的URL就是第二位.
我不知道关于cookie的一切,但如果用户代理对他们的cookie更加小心呢?
例如,如果发送的cookie取决于选项卡,该怎么办?我们现在都在使用标签冲浪,对吧?那么如果cookie的范围是标签呢?因此,如果我在标签1上打开我的银行网站并且我在标签2上浏览,则在标签2上调用获取/发布的任何脚本将仅发送在标签2中累积的cookie.
或者如果存储cookie /域,该怎么办?因此,当我在example.com上时,任何返回的cookie都会进入example.com cookie集合.然后当我在www.mybankingsite.com上时,所有的cookie都被放入mybankingsite.com集合中.因此,如果我访问example.com并运行调用get/post的脚本,则用户代理将仅发送example.com cookie.这与发送请求域的cookie不同.例如,如果脚本在example.com的网页中调用了mybankingsite.com,则用户代理将不会发送mybankingsite.com cookie.
我知道我无法控制用户代理的工作,但我只是在探索可能性
我有一个WPF UserControl的datacontext绑定到这样的类:
public class CheckBoxGridViewModel
{
public List<List<bool>> Checkboxes {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我希望它显示一个复选框网格.我假设我可以使用Itemscontrol,但不知道如何使用每行的动态列集来完成它.
这个问题似乎回答了我的问题,除了答案没有给出这个例子,我无法想出如何写出来.
所以问题是,如何编写xaml以显示Checkboxes属性的复选框,以便它们排列在一个漂亮的网格中?
外部列表将是每一行,内部列表将是行的每一列.
c# ×5
wpf ×4
data-binding ×3
mvvm ×2
.net ×1
casting ×1
collections ×1
combobox ×1
cookies ×1
csrf ×1
datacontract ×1
events ×1
generics ×1
grid ×1
implicit ×1
itemscontrol ×1
javascript ×1
knockout.js ×1
security ×1
selecteditem ×1
wcf ×1