2017-08-14 74 views
-5

如何從mvvm中的viewmodel類文件中的視圖中調用對象?如何在wpf mvvm中編寫丟失的焦點並獲得視圖模型中的焦點屬性?

如何在mvvm中調用viewmodel類文件中的視圖屬性?

如何在mvvm中編寫丟失的焦點並獲得視圖模型中的焦點屬性?

我不想在文件後面使用代碼;我想將view與viewmodel綁定,並在viewmodel中使用view的所有屬性。

//在視圖模型我寫此 公共類NetworkViewModel:INotifyPropertyChanged的 {

公共無效addPerson的(對象物obj) {

if(cb_group.Text.ToUpper() == "PRIMARY") 
{ 
    _networkList1.Add(new Person(){ FirstName = txt_fullName.Text}); 
} 

}

鑑於

//我寫這個

告訴我怎麼可能

+0

我認爲你對MVVM有一個誤解...... viewmodel不應該關注視圖特定的細節,如焦點,鼠標位置以及任何你可能想知道的東西。如果你把這些東西放到你的「viewmodel」中,它就會成爲視圖的一部分,那麼你將只有一個MV-without-a-VM模式;) – grek40

+0

爲什麼我不能做到這一點 –

+0

它不是那麼「*不能「*和更多*」不應該「*。如果你想做一些違背模式的事情,你應該真正描述你爲什麼需要它以及你嘗試過的一些背景。否則,你可能不會得到有用的答案。 – grek40

回答

1

這個答案解釋瞭如何向用戶顯示驗證結果,而不是將GotFocus和LostFocus等信息帶入viewmodel。首先,目標UI元素(例如,TextBox)需要一些Binding,其實際上可能無法驗證。由於您想要在視圖模型中決定事物,因此合理的方法是使用視圖模型中的IDataErrorInfo接口來識別錯誤。

爲了使綁定使用這種驗證技術,設置ValidatesOnDataErrors=True

<TextBox Margin="5" Text="{Binding Text1,ValidatesOnDataErrors=True,UpdateSourceTrigger=PropertyChanged}"/> 

與實例驗證視圖模型:

public class MyViewModel : INotifyPropertyChanged, IDataErrorInfo 
{ 
    public virtual string this[string columnName] 
    { 
     get 
     { 
      if (columnName == "Text1") 
      { 
       if (string.IsNullOrEmpty(Text1)) 
       { 
        return "Text is required!"; 
       } 
      } 
      return null; 
     } 
    } 

    private string _Text1; 
    public string Text1 
    { 
     get { return _Text1; } 
     set { _Text1 = value; RaisePropertyChangedEvent(); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected void RaisePropertyChangedEvent([CallerMemberName]string prop = null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(prop)); 
    } 
} 

現在,先試試這個沒有答案的其餘部分。將datacontext設置爲viewmodel,當您輸入/刪除任何內容時,您應該看到驗證結果如何以紅色邊框變化。


要自定義錯誤模板,你有兩個選擇:改變Validation.ErrorTemplate和使用風格引發的Validation.HasError財產。下面結合了這兩種方法,除非控制的重點是,以顯示錯誤和錯誤淡紅色背景上的紅色邊框:

<Window.Resources> 
    <ControlTemplate x:Key="MyErrorTemplate"> 
     <Border BorderBrush="Red" BorderThickness="2"> 
      <AdornedElementPlaceholder x:Name="controlWithError"/> 
     </Border> 
    </ControlTemplate> 

    <Style TargetType="TextBox"> 
     <Setter Property="Validation.ErrorTemplate" Value="{StaticResource MyErrorTemplate}"/> 
     <Style.Triggers> 
      <MultiTrigger> 
       <MultiTrigger.Conditions> 
        <Condition Property="IsFocused" Value="False"/> 
        <Condition Property="Validation.HasError" Value="True"/> 
       </MultiTrigger.Conditions> 
       <Setter Property="Background" Value="LightCoral"/> 
      </MultiTrigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 

正如你看到的,這是一個將被應用到沒有按任何文本隱式風格沒有適用於它的不同風格。

您可以以任何方式自定義樣式和/或控件模板中的可視外觀。

+0

嗨,先生/媽媽早上好,我想使用視圖模型中的WPF視圖形式的工具的名稱,就像我拿文本框命名它txtUserName現在我想在viewmodel PLZ中使用這個名字告訴我怎麼可能 –

+0

@ gauravshukladeveloper2017請閱讀MVVM。你的任何問題都沒有涉及到它,因此,除非你明白你在說什麼,否則你不會在這個主題上得到任何有用的答案。 – grek40

+0

嗨,先生/母親gaurav shukla這裏plz幫助我正是我想在viewmodel中使用(對象發件人,EventArgs e)綁定視圖的屬性是可能的,因爲通過使用這個我們可以做所有在viewmodel後面的代碼的工作做一些需要PLZ –