クラスへの実装の詳細であるデータは公開すべきではありませんが、私の意見では、とにかくこのタイプのデータにバインドする必要さえありません。ビューにバインドされるデータは、ビュー モデルのパブリック プロパティとコマンドである必要があります。ビューモデルはUI が 何であるかを定義することに注意してください。
ユーザー インターフェイスで変更が許可されていないパブリック プロパティは、セッターではなく、ゲッターのみを実装する必要があります。特定の条件下でのみ変更できるパブリック プロパティは、セッターでそれらの条件を適用する必要があります。ビューモデルは、すべての UI ロジック (プロパティとコマンド) を提供し、収容する必要があります。
また、そのすべてをテストする単体テストでビューモデルをラップする必要があります。
コメントのフィードバックに基づく更新:
class MyViewModel : ViewModelBase
{
private bool _showSomething;
public bool ShowSomething
{
get { return _showSomething; }
set
{
_showSomething = value;
RaisePropertyChanged("ShowSomething");
RaisePropertyChanged("TheThing");
}
}
public Something TheThing
{
get
{
if(_showSomething) { return _theThing; }
return _theOtherThing;
}
}
private Something _theThing;
private Something _theOtherThing;
}
編集*: 以下は、コメントに基づいて望ましいものに近い場合があります。
public interface IQueryControl
{
string Query { get; set; } //view passes query in
ReadOnlyCollection<string> QueryResultDescriptions { get; } //bind to combo items
string SelectedQueryDescription { get; set; } //bind to combo selection
object SelectedItem { get; } //resulting object
}
public class UserControlVM : ViewModelBase, IQueryControl
{
private string _query;
private ObservableCollection<object> _queryResults;
private ReadOnlyCollection<string> _externalResults;
private object _selectedResult;
public string Query
{
get { return _query; }
set
{
_query = value;
RaisePropertyChanged("Query");
UpdateQueryResults();
}
}
private void UpdateQueryResults()
{
//Do query which allocates / updates _queryResults;
_externalResults = new ReadOnlyCollection<string>((from entry in _queryResults select entry.ToString()).ToList<string>());
RaisePropertyChanged("QueryResultDescriptions");
}
public ReadOnlyCollection<string> QueryResultDescriptions
{
get { return _externalResults; }
}
public string SelectedQueryDescription
{
get { return _selectedResult.ToString(); }
set
{
SelectResult(value);
}
}
private void SelectResult(string value)
{
Dictionary<string, object> lookup = _queryResults.ToDictionary<object, string>((result) => { return result.ToString(); });
if (lookup.ContainsKey(value))
{
_selectedResult = lookup[value];
RaisePropertyChanged("SelectedQueryDescription");
RaisePropertyChanged("SelectedItem");
}
else
{
//throw something
}
}
public object SelectedItem
{
get { return _selectedResult; }
}
}