小编Jos*_*ose的帖子

WPF ComboBox SelectedItem

好的,我一直在与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)

wpf combobox selecteditem mvvm

7
推荐指数
1
解决办法
1万
查看次数

添加事件处理程序

有人可以告诉我以下陈述的区别是:

MyObject.MyEvent += new EventHandler(MyEventHandlerMethod);
vs.
MyObject.MyEvent += MyEventHandlerMethod;
Run Code Online (Sandbox Code Playgroud)

每当我+=点击标签时弹出第一个选项就会弹出,所以我总是离开它.但我想知道我是否可以写第二个.我猜他们两个都编译得一样,但我很好奇,如果那是真的.我很确定我只能看看IL,但我太懒了:)我宁愿问一下.

c# events event-handling

7
推荐指数
1
解决办法
223
查看次数

绑定到嵌套属性,其中链中的observable可以为null

我刚刚阅读了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中放置属性只是因为我得到一个绑定错误.

data-binding knockout.js

7
推荐指数
1
解决办法
7402
查看次数

如何解决C#中泛型类型约束的局限性?

好的,我正在寻找一些输入,我很确定.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约束应该问(我有权访问这个构造函数吗?我做的很棒!)

无论如何,欢迎任何输入.

c# compiler-construction generics type-constraints

6
推荐指数
2
解决办法
1471
查看次数

在DataContract Serializer元数据中包含XML注释

有没有办法在DataContract中发送属性的摘要信息?

例如

[DataContract]
public class MyClass
{
  /// <summary>
  /// My Summary information
  /// </summary>
  [DataMember]
  public int MyProperty {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

是否可以获得获得datacontract的客户?我怀疑它,只是希望有人知道我不知道的事情,这很可能.:)

wcf serialization datacontract

6
推荐指数
1
解决办法
1869
查看次数

隐含运算符?

我需要一些帮助.我正在创建一个像这样的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)

我怎么能做到这一点?

.net c# casting operator-overloading implicit

5
推荐指数
1
解决办法
298
查看次数

ObservableCollection数据绑定性能

我想知道为什么根据这篇文章和可观察集合比WPF中的List <>集合明显更快地绑定(20毫秒vs 1685毫秒,比800倍快).我查看了ObservableCollection的内部,它使用List作为它的存储集合对象(我使用了反射器并在构造函数中看到了这个)

public Collection()
{
    this.items = new List<T>();
}
Run Code Online (Sandbox Code Playgroud)

那么这里发生了什么?

c# data-binding collections wpf observablecollection

5
推荐指数
1
解决办法
2512
查看次数

获取WPF绑定的值

好吧,我不想在我的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)

c# data-binding wpf mvvm markup-extensions

5
推荐指数
1
解决办法
6313
查看次数

CSRF漏洞/ cookie问题

只想获得知情人士的意见.我正在考虑CSRF的漏洞,以及我所知道的最常见的反对它的方法.该方法是在返回的html中创建一个令牌,并添加一个具有相同值的cookie.因此,如果脚本试图发布帖子,他们就会have to guess the token thats embedded in the web page成功.

但是,如果他们针对特定网站,为什么他们不能只使用一个脚本

  1. 调用页面上的get(即使脚本无法访问,也会返回cookie)
  2. 解析html并获取令牌
  3. 在其中调用带有该令牌的帖子(返回的cookie将被发回)
  4. 他们已经成功提交了一份没有用户知识的表格

该脚本不需要知道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.

我知道我无法控制用户代理的工作,但我只是在探索可能性

javascript security cookies csrf session-cookies

5
推荐指数
1
解决办法
845
查看次数

WPF中的复选框网格

我有一个WPF UserControl的datacontext绑定到这样的类:

public class CheckBoxGridViewModel
{
  public List<List<bool>> Checkboxes {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

我希望它显示一个复选框网格.我假设我可以使用Itemscontrol,但不知道如何使用每行的动态列集来完成它.

这个问题似乎回答了我的问题,除了答案没有给出这个例子,我无法想出如何写出来.

所以问题是,如何编写xaml以显示Checkboxes属性的复选框,以便它们排列在一个漂亮的网格中?

外部列表将是每一行,内部列表将是行的每一列.

wpf grid itemscontrol

5
推荐指数
1
解决办法
2675
查看次数