2014-03-27 21 views
2

我有一個類,稱爲Model<T>,實現IDynamicObjectProvider幷包裝T類型的對象,轉發到下面的值屬性訪問,而增加額外的東西(例如,Model<T>實現INotifyPropertyChangedT沒有)。如何在編寫綁定時提供供Visual Studio XAML Designer使用的自定義屬性名稱列表?

我使用這些Model<T>對象在WPF的我DataContext性質,主要有:

public class Person { public string Name { get; set; } } 

public class EditPersonViewModel { 
    public Model<Person> Person { get; set; } 
    public ICommand SavePersonCommand { get; set; } 
} 
<StackPanel d:DataContext="{d:DesignInstance vm:EditPersonViewModel}"> 
    <TextBox Text="{Binding Person.Name}" /> 
    <Button Command="{Binding SavePersonCommand}" /> 
</StackPanel> 

的WPF綁定引擎結合Model<Person>動態getter和setter成功。

現在,我希望通過類型的XAML設計器中的屬性自動完成,當我編寫一個以Person.開頭的綁定時,需要儘可能少的應用程序代碼;理想情況下,圖書館的提供者完全可以實施Model<T>。 (我是寫圖書館的人,我希望我的客戶儘可能使用Model<T>課程)。

這裏是我知道會的工作方式,我的反對意見:

  1. 定義一個新的類,EditPersonViewModelDesign,這將反映所有EditPersonViewModel屬性,並用其作爲設計實例。

    public class EditPersonViewModelDesign { 
        public Person Person { get; set; } 
        public ICommand SavePersonCommand { get; set; } 
    } 
    
    <StackPanel d:DataContext="{d:DesignInstance vm:EditPersonViewModelDesign}"> 
        <TextBox Text="{Binding Person.Name}" /> 
        <Button Command="{Binding SavePersonCommand}" /> 
    </StackPanel> 
    

    雖然不需要的代碼不適當的量,但事實上,這個類仍然會在庫在運行時離開,除非我問人們是否添加有一個項目,構建複雜(只有這些類,或者他們添加構建變量)並不完全與我坐在一起。此外,Design和View模型類更容易分離。

  2. 縮小內部元件的數據上下文,並影響了新的設計實例給它,例如:

    <StackPanel d:DataContext="{d:DesignInstance vm:EditPersonViewModel}"> 
        <TextBox DataContext="{Binding Person}" 
          d:DataContext="{d:DesignInstance m:Person}" 
          Text="{Binding Name}" /> 
        <Button Command="{Binding SavePersonCommand}" /> 
    </StackPanel> 
    

    雖然這解決方案不需要創建新的類型,添加的XAML代碼感覺相當侵入到我。

回答

3

我不認爲存在實際上是一個令人滿意的解決方案在這裏,作爲唯一真正的「未解決辦法」將是智能感知的動態綁定目標的原生支持(即調用GetDynamicMemberNames上返回的DynamicMetaObjectModel<T>,所以設計實例GetMetaObject(),我會建議feature request,首先,

如果我是你的客戶,我不會花定義設計時綁定處處只爲IntelliSense支持的努力,它需要更多的想要指定正確的綁定而不是記住或查找並鍵入屬性名稱。

這是一個想法,可能有效。當然,我沒有對它進行測試,但是通過一些研究,它可能會讓你在那裏。你似乎知道,你在做什麼:

有在System.ComponentModel看看靜態DesignerProperties類的IsInDesignTool屬性:

DesignerProperties.IsInDesignTool 

A類​​的做法,可以在的ViewModels實施呈現爲here。這可能是返回內模型(T型的),而不是纏繞模型(模型)的方法。不知道它是否會讓你得到任何地方,但它可能是值得思考的。這是一個有趣的功能瞭解,反正...

最後的想法:改善航運代碼段的用戶體驗和思考的一種直觀的方式來區分設計時綁定和運行時綁定。也許是這樣的:它創建

d:Text="{Binding DesignModel.Name}" Text="{Binding Model.Name}" 

不知道,多麼強大VS代碼片段,因爲我使用ReSharper的,但ReSharper的,你會做DP

public abstract class ViewModelBase<T> 
{ 
    public Model<T> Model { get; } 

    // Maybe use compiler directives to throw exception if requested at runtime 
    public T DesignModel { get; } 
} 

代碼段控制變量$ControlProp$,屬性名的變量$PropName$。然後智能感知可以處理設計時綁定,並且如果您按下回車鍵,它會自動將屬性名稱複製到第二個綁定。

你會輸入一些快捷pbind,然後Text,回車,N,這將觸發智能感知,選擇Name,回車。完成。至少會很容易。

底線:我沒有一個即插即用的回答你的問題,但我的觀點可能很適合一些靈感......至少我希望如此。

+0

的一件事是,動態類普遍支持是根本不可能的,作爲一個'IDynamicMetaObjectProvider'實例可以自由返回不同的信息,依靠自身的實例的狀態,也就是說,沒有任何東西可以從簡單的知道的類型推斷目的。但是我正在尋找的解決方案應該僅僅代表'T'類型的靜態類型信息。無論如何,謝謝。 :) –

+0

誠然,智能感知仍然可以得到設計實例的元對象,但可以說,這是多麼有用將審議IDynamicObjectProvider'的'常見的使用情況。 – Marc

相關問題